visual vertical uiswing tutorial setlayout manager layouts javase docs java layout

vertical - setlayout java



XY Layout JAVA (4)

Esto no responde a su pregunta específica, pero además de estar de acuerdo con los otros comentarios, eche un vistazo a MiG Layout . Me he sentido igualmente frustrado con los diseños como novato de Swing, pero esto ha ayudado mucho.

¿Hay algún tipo de XY-Layout en Java?

Así que puedo configurar un botón en el cordinato X e Y y se supone que es tan grande, etc .... Porque este diseño de borde y cuadrícula y panel me vuelven loco. :)

Están fluyendo cada vez y se estancan. Y para hacerlos pequeños, debes colocar el panel en el panel del panel del panel ^^,


La razón por la cual los componentes se cambian de tamaño es para que todo se vea agradable sea cual sea el tamaño de la ventana, por lo que Swing desalienta la posición recta XY. Es posible que desee echar un vistazo a GroupLayout http://java.sun.com/docs/books/tutorial/uiswing/layout/group.html, que está diseñado para constructores de GUI, y la página mencionada anteriormente describe el uso de componentes invisibles para absorber los estiramientos por ejemplo: layout.setAutoCreateGaps(true);

SpringLayout también podría ser útil; consulte la guía visual

Si realmente quiere X e Y, configure el administrador de diseño como nulo y use setLocation () o setBounds (). REALMENTE REALMENTE no lo recomendaría, pero funciona. Lee este tutorial


Si realmente quieres hacer esto, usa

setLayout(null);

en el componente en el que está insertando las cosas, luego use

setBounds(x, y, width, height);

para establecer las coordenadas absolutas de los elementos. Ejemplo:

setLayout(null); JButton myButton = new JButton("Do Stuff"); add(myButton); myButton.setBounds(30, 30, 100, 30);

Sin embargo, la GUI resultante se verá no estándar, no se podrá redimensionar, y si tiene alguna complejidad, será difícil de mantener.

Sé que el diseño es frustrante, pero al final será mejor que utilices una combinación de BorderLayouts y FlowLayouts, o GridBagLayout, o un desarrollador de interfaz IDE como Eclipse o Netbeans.


Al configurar el diseño del contenedor como nulo (sin LayoutManager), puede establecer los límites del componente individualmente con component.setBounds (x, y, w, h).

Los diseños fijos son en el 99% de todos los casos un diseño de IU incorrecto (si sus etiquetas, por ejemplo, no obtienen su tamaño preferido, se topan con problemas mayores cuando la aplicación admite varios idiomas), entonces mi consejo es escribir un administrador de diseño especializado para sus necesidades específicas .

Escribir su gestor de diseño personalizado es bastante fácil, todo lo que tiene que hacer es poder calcular el tamaño preferido para un contenedor con componentes dados y su diseño, y hacer el diseño estableciendo los límites (calculados) de sus componentes. Me deshice de GridBagLayout y comencé a codificar mis propios diseños hace mucho tiempo, y el diseño nunca fue tan fácil.

Aquí hay un ejemplo de un diseño personalizado, que distribuye pares de componentes clave y de valor:

public class KeyValueLayout implements LayoutManager { public static enum KeyAlignment { LEFT, RIGHT; } private KeyAlignment keyAlignment = KeyAlignment.LEFT; private int hgap; private int vgap; public KeyValueLayout () { this(KeyAlignment.LEFT); } public KeyValueLayout (KeyAlignment keyAlignment) { this(keyAlignment, 5, 5); } public KeyValueLayout (int hgap, int vgap) { this(KeyAlignment.LEFT, hgap, vgap); } public KeyValueLayout (KeyAlignment keyAlignment, int hgap, int vgap) { this.keyAlignment = keyAlignment != null ? keyAlignment : KeyAlignment.LEFT; this.hgap = hgap; this.vgap = vgap; } public void addLayoutComponent (String name, Component comp) { } public void addLayoutComponent (Component comp, Object constraints) { } public void removeLayoutComponent (Component comp) { } public void layoutContainer (Container parent) { Rectangle canvas = getLayoutCanvas(parent); int ypos = canvas.y; int preferredKeyWidth = getPreferredKeyWidth(parent); for (Iterator<Component> iter = new ComponentIterator(parent); iter.hasNext();) { Component key = (Component) iter.next(); Component value = iter.hasNext() ? (Component) iter.next() : null; int xpos = canvas.x; int preferredHeight = Math.max(key.getPreferredSize().height, value != null ? value.getPreferredSize().height : 0); if (keyAlignment == KeyAlignment.LEFT) key.setBounds(xpos, ypos, key.getPreferredSize().width, key.getPreferredSize().height); else key.setBounds(xpos + preferredKeyWidth - key.getPreferredSize().width, ypos, key.getPreferredSize().width, key.getPreferredSize().height); xpos += preferredKeyWidth + hgap; if (value != null) value.setBounds(xpos, ypos, canvas.x + canvas.width - xpos, preferredHeight); ypos += preferredHeight + vgap; } } public Dimension minimumLayoutSize (Container parent) { int preferredKeyWidth = getPreferredKeyWidth(parent); int minimumValueWidth = 0; int minimumHeight = 0; int lines = 0; for (Iterator<Component> iter = new ComponentIterator(parent); iter.hasNext();) { lines++; Component key = (Component) iter.next(); Component value = iter.hasNext() ? (Component) iter.next() : null; minimumHeight += Math.max(key.getPreferredSize().height, value != null ? value.getMinimumSize().height : 0); minimumValueWidth = Math.max(minimumValueWidth, value != null ? value.getMinimumSize().width : 0); } Insets insets = parent.getInsets(); int minimumWidth = insets.left + preferredKeyWidth + hgap + minimumValueWidth + insets.right; minimumHeight += insets.top + insets.bottom; if (lines > 0) minimumHeight += (lines - 1) * vgap; return new Dimension(minimumWidth, minimumHeight); } public Dimension preferredLayoutSize (Container parent) { int preferredKeyWidth = getPreferredKeyWidth(parent); int preferredValueWidth = 0; int preferredHeight = 0; int lines = 0; for (Iterator<Component> iter = new ComponentIterator(parent); iter.hasNext();) { lines++; Component key = (Component) iter.next(); Component value = iter.hasNext() ? (Component) iter.next() : null; preferredHeight += Math.max(key.getPreferredSize().height, value != null ? value.getPreferredSize().height : 0); preferredValueWidth = Math.max(preferredValueWidth, value != null ? value.getPreferredSize().width : 0); } Insets insets = parent.getInsets(); int preferredWidth = insets.left + preferredKeyWidth + hgap + preferredValueWidth + insets.right; preferredHeight += insets.top + insets.bottom; if (lines > 0) preferredHeight += (lines - 1) * vgap; return new Dimension(preferredWidth, preferredHeight); } public Dimension maximumLayoutSize (Container target) { return preferredLayoutSize(target); } private int getPreferredKeyWidth (Container parent) { int preferredWidth = 0; for (Iterator<Component> iter = new ComponentIterator(parent); iter.hasNext();) { Component key = (Component) iter.next(); if (iter.hasNext()) iter.next(); preferredWidth = Math.max(preferredWidth, key.getPreferredSize().width); } return preferredWidth; } private Rectangle getLayoutCanvas (Container parent) { Insets insets = parent.getInsets(); int x = insets.left; int y = insets.top; int width = parent.getSize().width - insets.left - insets.right; int height = parent.getSize().height - insets.top - insets.bottom; return new Rectangle(x, y, width, height); } private class ComponentIterator implements Iterator<Component> { private Container container; private int index = 0; public ComponentIterator (Container container) { this.container = container; } public boolean hasNext () { return index < container.getComponentCount(); } public Component next () { return container.getComponent(index++); } public void remove () { } } }

Simplemente configure el diseño y agregue etiquetas y valores alternativamente. Es fácil de usar, especialmente en comparación con GridBagLayout o paneles anidados con diseños personalizados.