Oppure

Loading
04/11/14 21:15
GN
Salve a tutti, è da un po' che non riesco a risolvere un problema con il GridBagLayout. Ho cercato e provato vari metodi ma niente, non riesco a capire come fare. In pratica io ho scritto questo codice

	JPanel polyEditorPanel = new JPanel();
	JList polyVertices = new JList(polyVerticesModel);
	JButton polyAddVertex = new JButton("Add vertex");
	JButton polyRemoveVertex = new JButton("Remove vertex");
	JSpinner polyVertexX = new JSpinner();
	JSpinner polyVertexY = new JSpinner();
	JButton polyEditVertex = new JButton("Edit");

         //...

		polyEditorPanel.setLayout(new GridBagLayout());
		GridBagConstraints gc = new GridBagConstraints();
		gc.fill = GridBagConstraints.BOTH;
		gc.gridwidth = 3;
		gc.gridheight = 2;
		//gc.weightx = 0.5;
		gc.anchor = gc.WEST;
		polyEditorPanel.add(polyVertices, gc);
		gc.anchor = gc.EAST;
		//gc.weightx = 1;
		gc.gridwidth = 1;
		gc.gridheight = 1;
		gc.gridx = 3;
		gc.gridy = 0;
		polyEditorPanel.add(polyAddVertex, gc);
		gc.gridx = 4;
		polyEditorPanel.add(polyRemoveVertex, gc);	
		gc.gridx = 3;
		gc.gridy = 1;
		polyEditorPanel.add(polyVertexX, gc);	
		gc.gridx = 4;
		polyEditorPanel.add(polyVertexY, gc);	
		gc.gridx = 5;
		polyEditorPanel.add(polyEditVertex, gc);	

Da cui ottengo questo risultato: i.imgur.com/…
Il problema è che vorrei che la JList (che nell'immagine contiene un elemento con scritto "ciao";) fosse più larga (dovrebbe occupare metà del contenitore) e i pulsanti e i JSpinner più piccoli.
Ho cercato varie guide sul GridBagLayout e ho scoperto che è abbastanza complesso... il mio problema centra forse con la distribuzione dei "pesi" (weightx, weighty)? Perchè quelli proprio non ho capito come funzionano... ho provato ad agire sul controllo (con setSize, setMinimunSize) ma niente il risultato è sempre quello.

Qualcuno saprebbe gentilmente indicarmi dove sbaglio e come potrei risolvere? Grazie ;)
aaa
05/11/14 11:19
Bonny
Concordo con la complessità di GridBagLayout :)

Io ho provato a smanettare e ho notato che la larghezza del JList dipende dalla lunghezza della stringa (i valori intendo nel nostro caso "ciao";). Infatti se provi ad inserire una parola più lunga il JList si ridimensiona.
Però questo non è il massimo, quindi ho impostato una dimensione fissa delle celle del JList, in questo modo:

    Object[] data = {"ciao"};
    
    JPanel polyEditorPanel = new JPanel();
    JList polyVertices = new JList(data);
    
    //Fixed a 200
    polyVertices.setFixedCellWidth(200);
    
    JButton polyAddVertex = new JButton("Add vertex");
    JButton polyRemoveVertex = new JButton("Remove vertex");
    JSpinner polyVertexX = new JSpinner();
    JSpinner polyVertexY = new JSpinner();
    JButton polyEditVertex = new JButton("Edit");

    //...
    polyEditorPanel.setLayout(new GridBagLayout());
    GridBagConstraints gc = new GridBagConstraints();
    gc.fill = GridBagConstraints.BOTH;
    gc.gridwidth = 3;
    gc.gridheight = 2;
    //gc.weightx = 0.5;
    gc.anchor = gc.WEST;
    polyEditorPanel.add(polyVertices, gc);
    gc.anchor = gc.EAST;
    //gc.weightx = 1;
    gc.gridwidth = 1;
    gc.gridheight = 1;
    gc.gridx = 3;
    gc.gridy = 0;
    polyEditorPanel.add(polyAddVertex, gc);
    gc.gridx = 4;
    polyEditorPanel.add(polyRemoveVertex, gc);
    gc.gridx = 3;
    gc.gridy = 1;
    polyEditorPanel.add(polyVertexX, gc);
    gc.gridx = 4;
    polyEditorPanel.add(polyVertexY, gc);
    gc.gridx = 5;
    polyEditorPanel.add(polyEditVertex, gc);
    
    JFrame f = new JFrame();
    f.setVisible(true);
    f.setBounds(0, 0, 500, 300);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.getContentPane().add(polyEditorPanel);


così si allarga, potrebbe essere una soluzione.

PS: A suo tempo quando studiai Swing, avevo trovato questo tutorial su GridBagLayout
drive.google.com/file/d/0ByNkKJSEWSy9ZTI4MktWTzJ6aVU/…
A mio parere, fatto bene.

PS2 :): Per carità è giusto all'inizio farle a mano queste cose. Per capire le lib javax.swing... ma dopo un pò ti accorgi che ci sono strumenti potentissimi per far ciò, con drag&drop e click!! Detto questo ti consiglio di provare NetBeans. (crea un progetto java -> tasto destro scegli "JForm form .." )
Ultima modifica effettuata da Bonny 05/11/14 11:40
aaa
05/11/14 18:48
GN
Perfetto, grazie mille!! :k:
Il metodo setFixedCellWidth era proprio quello che cercavo.
aaa