Diseño variable en Swing

¿Cómo harías para obtener una GUI de aspecto decente cuando no sabes cuántos componentes tendrás y qué tan grandes serán?

Un usuario, por ejemplo, ingresa cuántos campos de texto quiere y cuáles de esos campos de texto están agrupados en paneles delimitados y el progtwig genera esto.

He estado usando GridLayout, pero el problema es que hace que todas las celdas tengan el mismo ancho y alto, lo que está bien cuando todos los componentes tienen el mismo tamaño, pero cuando yo, por ejemplo, tengo un campo de texto y un panel con borde con múltiples campos, ya sea el campo de texto se estira o el panel se aprieta.

Me gustaría que todos los componentes tuvieran su tamaño mínimo, pero igual, ya sabes, utilizable.

Ejemplo de cómo es ahora, usando GridLayout , todos los campos son normales, JTextFields de una sola línea donde el panel titulado fecha está completamente comprimido (tiene tres campos) y los campos de primer nivel son demasiado grandes. Alguien tiene punteros?

MiGLayout tiene un gran atractivo, pero BoxLayout es una alternativa.

imagen

 import java.awt.*; import java.util.List; import java.util.ArrayList; import javax.swing.*; public class BoxTest extends JPanel { private List fields = new ArrayList(); public BoxTest() { this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); this.add(createPane(3, "One ", Color.red)); this.add(createPane(3, "Two ", Color.green)); this.add(createPane(10, "Three ", Color.blue)); } private JPanel createPane(int n, String s, Color c) { JPanel outer = new JPanel(); outer.setLayout(new BoxLayout(outer, BoxLayout.Y_AXIS)); outer.setBorder(BorderFactory.createLineBorder(c, 2)); for (int i = 0; i < n; i++) { JPanel inner = new JPanel(); inner.setLayout(new BoxLayout(inner, BoxLayout.X_AXIS)); JLabel label = new JLabel(s + i + ":", JLabel.RIGHT); label.setPreferredSize(new Dimension(80, 32)); inner.add(label); JTextField tf = new JTextField("Stackoverflow!", 32); inner.add(tf); fields.add(tf); outer.add(inner); } return outer; } private void display() { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JScrollPane jsp = new JScrollPane(this, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); this.validate(); Dimension d = this.getPreferredSize(); d.height /= 2; jsp.getViewport().setPreferredSize(d); jsp.getVerticalScrollBar().setUnitIncrement( this.getPreferredSize().height / fields.size()); f.add(jsp); f.pack(); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new BoxTest().display(); } }); } } 

Yo miraría miglayout. Es mucho más útil que cualquiera de los administradores de diseño incorporados.

Su objective general: “tamaños de componentes utilizables” choca con “número desconocido”. Haga el número lo suficientemente grande y no se ajustará a ninguna pantalla.

Overthink si no estaría mejor con el uso de JTables (las celdas pueden ser editables) en conjunción con un JScrollPanel. Si quiere / debe mantener su enfoque de generar componentes, coloque todo el JPanel que contiene sus componentes en un JScrollPane, de esa manera los componentes no se comprimirán demasiado.

Sí, MiGLayout es bueno. Puedes hacer casi cualquier cosa con eso.

El tamaño mínimo en AWT y Swing generalmente no tiene sentido. Sugiero agregar un panel para delegar el tamaño mínimo al tamaño preferido original, y posiblemente agregar un poco al nuevo tamaño preferido. En GridBagLayout agrega pesas donde quieras espacio adicional para el tamaño normal. Como menciona Durandal, aparecer barras de desplazamiento alrededor de la ventana del nivel superior supera el diseño o la salida de la pantalla (estoy escribiendo esto en una netbook, así que sé sobre ventanas más grandes que la pantalla).