Incolonnare le textArea in un JScrollPane

di il
3 risposte

Incolonnare le textArea in un JScrollPane

Salve a tutti, sono alle prese con un progetto e con un problema all'apparenza molto semplice ma che proprio non riesco a risolvere: tramite un ciclo creo delle textArea, rappresentanti la descrizione di ogni oggetto. Se inserisco tutto in un pannello semplice, le textArea vengono incolonnate, proprio come voglio io, col problema, però, che quando queste diventano troppe, le ultime non vengono visualizzate. Proprio per questo motivo, credo sia necessario l'inserimento di una barra di scorrimento e quindi ho creato una JScrollPane a cui passo come parametro il pannello su cui sono inserite le textArea, solo che, una volta fatto ciò, le textArea vengono scritte una dopo l'altra, in un'unica riga e l'unica barra che appare è quella che fa scorrere l'elenco in orizzontale. Ho provato anche con l'escape sequence "\n" ma il risultato è che mi stacca le descrizioni degli oggetti, non va a capo. Come posso far sì che le aree di testo vengano incolonnate una sotto l'altra e che mi appaia la barra di scorrimento verticale?

Questo è una parte di codice:
JPanel c = new JPanel();
 JScrollPane scrollPane = new JScrollPane(c);


 public void actionPerformed(ActionEvent e) {
	
	 String com = e.getActionCommand();
 
	 
	 if (com == VISUALIZZA) {
		 f.setVisible(false);
		 this.setVisible(true);
		 
	
		for(JTextArea l : listaText) {
			
		     c.remove(l);
			
		}
		 c.revalidate();
		 
	
			
		 int i = 0;
			while (i<listaVeicoli.size()){
			  JTextArea sintesi1 = new JTextArea();
			  
			 
			   sintesi1 = new JTextArea( " "  + listaVeicoli.get(i).toString());
			  sintesi1.setEditable(false);
			  sintesi1.setRows(listaVeicoli.size());
			  sintesi1.setForeground(Color.black);
			  JTextArea spazio = new JTextArea ("\n");
			  sintesi1.setBackground(Color.yellow);
			  listaText.add(sintesi1);		  
				c.add(sintesi1);
				c.add(spazio);
				i++;
			}
			
		   this.add(scrollPane);
	 }
Ho omesso il costruttore e altre parti del codice che non hanno nulla a che fare col problema, la grandezza della JFrame è stata impostata ( this.setSize(500, 400) ) ed è resa visibile (this.setVisible(true)). Spero mi possiate dare qualche dritta, grazie.

3 Risposte

  • Re: Incolonnare le textArea in un JScrollPane

    ytreka ha scritto:


    Se inserisco tutto in un pannello semplice, le textArea vengono incolonnate, proprio come voglio io, col problema, però, che quando queste diventano troppe, le ultime non vengono visualizzate. Proprio per questo motivo, credo sia necessario l'inserimento di una barra di scorrimento e quindi ho creato una JScrollPane a cui passo come parametro il pannello su cui sono inserite le textArea, solo che, una volta fatto ciò, le textArea vengono scritte una dopo l'altra, in un'unica riga
    JPanel ha per default un FlowLayout, che fa "fluire" i componenti nel contenitore esattamente come un word-processor fa fluire il testo nel documento.
    Può darsi (non lo so per certo) che nel primo caso citato le textarea fluiscano in modo tale che guarda caso "sembrano" in colonna (ma in realtà, logicamente non lo sono per il FlowLayout).
    Nel JScrollPane le cose vanno diversamente. JScrollPane per sapere se/di quanto scrollare, si basa sul preferred size del componente (o sulla interfaccia Scrollable per certi componenti "avanzati"). E il preferred size dipende dal layout manager (che in questo caso è FlowLayout).
    Quando JScrollPane chiede al JPanel "dimmi il tuo preferred size", JPanel lo chiede al FlowLayout. La logica del preferred size calcolato da FlowLayout è molto semplice: è quella dimensione tale da far stare tutti i componenti su una UNICA "riga".

    Quindi la soluzione è molto semplice: usa un altro layout manager, es. un BoxLayout con asse verticale. Ma attenzione, non basta. BoxLayout rispetta il preferred size ma anche il maximum size dei componenti. E in JTextArea il maximum size per default è "enorme", grandissimo. Quindi bisogna saper gestire anche il maximum size delle textarea, altrimenti noterai effetti "strani".


    P.S. una textarea solo per "spazio" ( new JTextArea ("\n") ) ragionevolmente non ha senso/utilità. O si "gioca" con il layout manager se offre la possibilità di specificare un gap tra componenti (tipo in GridLayout) o si gioca mettendo dei componenti di gap appositi, tipo Box.createVerticalStrut(n) .
  • Re: Incolonnare le textArea in un JScrollPane

    Innanzitutto grazie per i consigli. Prima di ritentare volevo dirti che in precedenza avevo provato a mettere una JLabel al posto di una JTextArea, secondo te, è più facile gestire la situazione con una label o con una textArea? Oppure alla fin dei conti, non cambia nulla?
  • Re: Incolonnare le textArea in un JScrollPane

    Ho risolto così. Il risultato è abbastanza soddisfacente: le diciture adesso sono incolonnate, aggiungendo oggetti alla lista, le dimensioni delle TextField si riducono fino a che, ad un certo punto, compare la barra di scorrimento in verticale. Mi sarebbe piaciuto che fossero state centrate e invece sono tutte spostate verso sinistra, comunque gli unici effetti strani che ho notato, li ho rimossi togliendo la textfield "spazio" contenente "\n". Ho provato poi anche a settare preferred, maximum e minimum size delle textField, ma non cambiava assolutamente nulla, indipendentemente dai parametri che impostavo al momento dei settaggi. Questo è il codice:
    public void actionPerformed(ActionEvent e) {
    	
    	 String com = e.getActionCommand();
         
    	 
    	 
    	 if (com == VISUALIZZA) {
    		 f.setVisible(false);
    		 this.setVisible(true);
    		 BoxLayout boxLayout = new BoxLayout(c, BoxLayout.Y_AXIS);
    		 //Dimension dimText = new Dimension(200, 70);
    		
    		 c.setLayout(boxLayout);
    		// scroll.removeAll();
    		// scroll.revalidate();
    		for(JTextArea l : listaText) {
    			
    		     c.remove(l);
    		    //rows = l.getRows();
    			
    		}
    		 c.revalidate();
    		 
    	
    			
    		 int i = 0;
    			while (i<listaVeicoli.size()){
    			  JTextArea sintesi1 = new JTextArea();
    			 
    			
    			  sintesi1 = new JTextArea( " "  + listaVeicoli.get(i).toString());
    			  sintesi1.setEditable(false);
    			  
    			  sintesi1.setForeground(Color.black);
    			 
    			  sintesi1.setBackground(Color.LIGHT_GRAY);
    			  
    			
    			  listaText.add(sintesi1);
    			 
    			 
    			  
    				c.add(sintesi1);
    				
    				i++;
    		
    		
    			}
    		
    		   this.add(scrollPane);
    		 
    		 
    	 } 
Devi accedere o registrarti per scrivere nel forum
3 risposte