PDA

View Full Version : [JAVA] BorderLayout, Box e JTextField


redcloud
22-01-2008, 18:43
Salve, ho un pannello con layout BorderLayout. A south ho un JButton, poco importa. Al centro ho un Box.createVerticalBox() che a sua volta contiene:

JTextField
Box.createGlue()
JTextField

Il problema è che i due JTextField non vengono distanziati affatto, anzi vengono allargati dividendosi a metà lo spazio. Cosa che con i JButton per esempio non avviene. Come risolvo?

redcloud
22-01-2008, 20:39
Qualcosa del genere insomma...


import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;


public class Prova {

public static void ok() {
JFrame frame = new JFrame();

frame.setSize(new Dimension(400, 600));
frame.setLayout(new BorderLayout());

Box south = Box.createHorizontalBox();
south.add(Box.createGlue());
south.add(new JButton("CIAO"));
frame.add(south, BorderLayout.SOUTH);

Box center = Box.createVerticalBox();
center.add(Box.createGlue());
JButton button = new JButton("OK");
button.setLayout(new BoxLayout(button, BoxLayout.LINE_AXIS));
center.add(button);
frame.add(center, BorderLayout.CENTER);

frame.setVisible(true);
}

public static void wrong() {
JFrame frame = new JFrame();

frame.setSize(new Dimension(400, 600));
frame.setLayout(new BorderLayout());

Box south = Box.createHorizontalBox();
south.add(Box.createGlue());
south.add(new JButton("CIAO"));
frame.add(south, BorderLayout.SOUTH);

Box center = Box.createVerticalBox();
center.add(Box.createGlue());
JTextField field = new JTextField();
field.setLayout(new BoxLayout(field, BoxLayout.LINE_AXIS));
center.add(field);
frame.add(center, BorderLayout.CENTER);

frame.setVisible(true);
}

static public void main(String[] args) {

ok();
wrong();
}
}

banryu79
23-01-2008, 08:52
Hai provato sostituendo Box.createGlue() con Box.createHorizontalGlue() ?

Se glue non funge come vorresti puoi sperimentare con struts e rigidArea (vedi qui (http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/Box.html))

redcloud
23-01-2008, 13:43
Niente, sembra che JTextField se ne freghi delle impostazioni e si spalmi sembre su tutto lo spazio disponibile.

banryu79
23-01-2008, 15:34
Incapsulandolo in un JPanel invece? Vabbè, siamo alla frutta :D

AMGOD
23-01-2008, 16:34
Hai provato ad usare il costruttore del JTextField passandogli un intero?
JTextField field = new JTextField(10); per esempio.
Così dovresti regolare la dimensione, non ho capito se hai esigenze sulla posizione...

redcloud
23-01-2008, 18:30
Fermi tutti ho capito. Box (e BoxLayout) tendono a spalmare gli oggetti su tutta la superficie disponibile tenendo conto però della dimensione massima degli oggetti. JButton ha una dimensione massima standard mentre JTextField ha dimensione massima +infinto :D Quindi il problema si risolve dando a JTextField una dimensione fissa per l'altezza (20) e Integer.MAX_VALUE per la larghezza.

In termini di codice dovrebbe essere qualcosa del genere:


import java.awt.Dimension;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class Prova {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(new Dimension(300, 500));

frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.PAGE_AXIS));
frame.getContentPane().add(new JButton("OK"));
JTextField field = new JTextField();
field.setMaximumSize(new Dimension(500, 20));

frame.getContentPane().add(field);
frame.setVisible(true);
}
}

banryu79
24-01-2008, 08:34
Bene, ho imparato qualcosa di nuovo :D

Fin'ora non ho mai avuto bisogno di gestirmi i dettagli di layout dell'interfaccia grafica a questo livello, ho sempre interagito tramite Matisse (editor grafico dell'IDE NeatBeans) e mi è sempre andata bene :)

redcloud
24-01-2008, 09:23
Bene, ho imparato qualcosa di nuovo :D

Fin'ora non ho mai avuto bisogno di gestirmi i dettagli di layout dell'interfaccia grafica a questo livello, ho sempre interagito tramite Matisse (editor grafico dell'IDE NeatBeans) e mi è sempre andata bene :)

Io matisse l'ho abbandonato, il codice non è personalizzabile totalmente e questa cosa non mi piace proprio.

banryu79
24-01-2008, 09:25
Io matisse l'ho abbandonato, il codice non è personalizzabile totalmente e questa cosa non mi piace proprio.

E cosa usi come sostituto? Non dirmi che ti fai tutto a manina :mbe:

redcloud
24-01-2008, 10:13
E cosa usi come sostituto? Non dirmi che ti fai tutto a manina :mbe:

:stordita: Campo col riciclo. Tanto le Dialog son sempre quelle, basta spostare i componenti :D Visual Editor su eclipse è più personalizzabile.