2012-02-09 18 views
9

he navegado alrededor y no han encontrado una solución que se adapta específicamente a mi situación. Tengo un panel que puedo mostrar en un cuadro de diálogo:java BoxLayout panel de

//create dialog panel 
JPanel panel = new JPanel(); 
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
panel.add(headerPanel); 
panel.add(type1Panel); 
panel.add(type2Panel); 
panel.add(type3Panel); 
panel.add(type4Panel); 
panel.add(type5Panel); 
panel.add(type6Panel); 

int result = JOptionPane.showConfirmDialog(null, panel, "Please enter values.", JOptionPane.OK_CANCEL_OPTION); 

El tamaño de los dos últimos paneles, Type5 & type6, son de igual tamaño para que se vean bien. Sin embargo, el encabezado y los primeros 4 paneles son de diferentes tamaños y me gustaría que todos se alineen a la izquierda. Hasta el momento no he encontrado una buena solución para solucionar esto.

La pregunta es, ¿cómo puedo alinear a la izquierda de los primeros 5 paneles, pero no durará 2? Si no, ¿cómo puedo dejarlos alineados? El setalignmentx() no está disponible para paneles. He intentado usar GridLayout, pero el ancho de la ventana principal de la interfaz gráfica de usuario es bastante grande y no encaja bien en la pantalla, de ahí el BoxLayout a lo largo del eje Y. Gracias por cualquier ayuda o sugerencia.

+0

trabajar con esto ahora mismo: headerPanel.setAlignmentX (Component.LEFT_ALIGNMENT); Pero parece ser lo que sea. He visto a personas mencionar para evitar hacer esto. – whitewolfpgh

+0

'El setalignmentx() no está disponible para paneles. -' setAlignmentX() 'está disponible para mí. ¿Podrías aclarar? – Thomas

+1

Bueno, descubrí el problema. Si haces panel.add (headerPanel); luego haz el headerPanel.setAlignmentX (Component.LEFT_ALIGNMENT); no se alineará correctamente Sin embargo, hacer la alineación primero y luego agregar headerPanel al panel del diálogo funciona bien. Imagínate. – whitewolfpgh

Respuesta

22

Aquí es un ejemplo que alinear a la izquierda de todos los JPanels añadidos al panel utilizado como un contenedor.

JPanel a = new JPanel(); 
    JPanel b = new JPanel(); 
    JPanel c = new JPanel(); 

    a.setBackground(Color.RED); 
    b.setBackground(Color.GREEN ); 
    c.setBackground(Color.BLUE); 

    a.setMaximumSize(new Dimension( 10, 10)); 
    b.setMaximumSize(new Dimension( 50, 10)); 

    a.setAlignmentX(Component.LEFT_ALIGNMENT);//0.0 
    b.setAlignmentX(Component.LEFT_ALIGNMENT);//0.0 
    c.setAlignmentX(Component.LEFT_ALIGNMENT);//0.0 

    JPanel panel = new JPanel(); 
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
    panel.add(a); 
    panel.add(b); 
    panel.add(c); 

    int result = JOptionPane.showConfirmDialog(null, panel, "Please enter values.", JOptionPane.OK_CANCEL_OPTION); 
+4

Por favor, reemplace los números mágicos con la constante adecuada. – mre

+3

Los métodos 'setAlignmentX' y' setAlignmentY' toman un 'float', solo para ser claros. 'JComponent' tiene las siguientes constantes de alineación heredadas de' java.awt.Component': 'BOTTOM_ALIGNMENT',' CENTER_ALIGNMENT', 'LEFT_ALIGNMENT',' RIGHT_ALIGNMENT', 'TOP_ALIGNMENT'. Usar estos hace que el código sea más legible, al menos para mí. – Paul

+4

@mre ¿Por qué? Para este ejemplo, solo sirve para agregar complejidad. El código es simple y legible. Simplicidad sobre la regularidad para ejemplos como este. –

4

Debe usar setAlignmentX en los paneles porque está disponible para JPanel. Los métodos setAlignmentX y setAlignmentY se encuentran en JComponent, que JPanel extiende. Funciona ... Tengo un código que usa esos métodos para alinear JPanels en un BoxLayout.

Ok, bien, editar su pregunta mientras estoy respondiendo él :)

En lugar de utilizar un JPanel trate de usar un Box. He encontrado que la clase Box es muy útil como contenedor. A partir de la API:

Un contenedor ligero que usa un objeto BoxLayout como su controlador de distribución . Box proporciona varios métodos de clase que son útiles para contenedores usando BoxLayout, incluso contenedores que no son de caja.

Si aún no lo ha visto, el tutorial How to Use BoxLayout es muy útil.

+0

Gracias por esto. 'setAlignmentX' es útil para todas las instancias' JComponent'. – KomodoDave

11

Crea un objeto horizontal javax.swing.Box para contener cada objeto typenPanel. El uso de puntales horizontales y pegamento que puede hacer lo que desee:

Box b1 = Box.createHorizontalBox(); 
b1.add(type1Panel); 
b1.add(Box.createHorizontalGlue()); 
panel.add(b1); 

Por simplicidad, escribir un método de ayuda a hacer esto para usted:

private Component leftJustify(JPanel panel) { 
    Box b = Box.createHorizontalBox(); 
    b.add(panel); 
    b.add(Box.createHorizontalGlue()); 
    // (Note that you could throw a lot more components 
    // and struts and glue in here.) 
    return b; 
} 

continuación:

panel.add(leftJustify(headerPanel)); 
panel.add(leftJustify(type1Panel)); 
panel.add(leftJustify(type2Panel)); 

etc. ... Puede hacerse más elegante con cada línea, agregando componentes, pegamento y puntales. He tenido una gran suerte anidando profundamente cajas verticales y horizontales, y escribiendo métodos de ayuda cuando quiero hacer el mismo diseño en una caja más de una vez. No hay límites para lo que puede hacer, mezclando componentes, puntales y pegamento según sea necesario.

estoy seguro de que hay una mejor manera de hacer todo esto, pero no he encontrado todavía. Y el cambio de tamaño dinámico permite que un usuario con pedacitos de texto utilice una ventana pequeña y un usuario con mucho texto lo cambie de tamaño para que todo encaje.

Cuestiones relacionadas