PDA

View Full Version : [JAVA] Che layout manager usereste per posizionare JButtons come in una calcolatrice?


sonenos
11-02-2010, 16:35
Ragazzi vi scrivo per una cosa molto semplice ma che mi dà problemi :help:
In un frame uso al centro un gridLayout contenente 4 JButton:
più; meno; per; diviso. Sappiamo che un gridLayout non ascolta alcun setPreferredSize o setMaximumSize ed i bottoni vengono disposti con la dimensione massima disponibile nel frame. :sofico: Quindi ho passato alla grid dei JPanels contenenti i JButton così:
JPanel prova = new JPanel(new GridLayout(2,2,10,10));
prova.add(wrap(plus));
prova.add(wrap(minus));
prova.add(wrap(per));
prova.add(wrap(divide));
window.add(prova, BorderLayout.CENTER);
....
public static JComponent wrap(JComponent comp) {
//Dimension d = new Dimension(60,60);
//comp.setPreferredSize(d);
JPanel panel = new JPanel();
panel.add(comp);
return panel;
}

Dentro al metodo wrap posso anche gestire la dimensione dei componenti che passo. Il problema è che i panels contenenti i pulsanti vengono attaccati al bordo estremo della grid.
L'esempio del codice è questo:

http://img96.imageshack.us/img96/9431/stillnot.jpg

Voi che soluzione avete per posizionare dei bottoni al centro del frame, come se fosse una calcolatrice?? Senza uso di IDEs

Grazie!!!

banryu79
11-02-2010, 17:01
Una soluzione è infilare ogni pulsante in una Box orizzontale anteponendo e posponendo al component della colla orizzontale:

private void initComponents() {
JTextField inputField = new JTextField();
frame.add(inputField, BorderLayout.NORTH);

JPanel centralPane = new JPanel(new GridLayout(2,2,10,10));
JButton opMult, opDiv, opSum, opSub;
opMult = new JButton("*");
opDiv = new JButton("/");
opSum = new JButton("+");
opSub = new JButton("-");
centralPane.add(wrapped(opMult));
centralPane.add(wrapped(opDiv));
centralPane.add(wrapped(opSum));
centralPane.add(wrapped(opSub));
frame.add(centralPane, BorderLayout.CENTER);
}

private JComponent wrapped(JComponent c) {
Box box = Box.createHorizontalBox();
box.add(Box.createHorizontalGlue());
box.add(c);
box.add(Box.createHorizontalGlue());
return box;
}


Un'altra, probabilmente migliore, è utilizzare GridBagLayout come LayoutManager al posto di GridLayout.
Se ti vuoi cimentare con GridBagLayout ti consiglio caldamente il tutorial in proposito scritto da PGI che trovi nella sezione Tutorial.
Se poi non bastasse puoi consultare anche la sezione apposita del "Really Big Index" (Java Tutorial della Sun, ops... Oracle).