2012-02-10 23 views
5

En el siguiente código, al llamar al setAlignmentX con Component.LEFT_ALIGNMENT esperaba obtener una etiqueta alineada a la izquierda sobre un control deslizante centrado. Por alguna razón, la etiqueta también está centrada, aparentemente independientemente del valor que se pase a setAlignmentX.Java Swing BoxDiseño ignorando AlignmentX

¿Qué valor debo pasar a setAlignmentX para alinearlo a la izquierda?

package myjava; 

import java.awt.Component; 
import java.awt.Container; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JSlider; 

public class LayoutTest { 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame frame = new JFrame("BoxLayoutDemo"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       // create left aligned label over centered column 
       Container contentPane = frame.getContentPane(); 
       contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); 
       JLabel label = new JLabel("test"); 
       label.setAlignmentX(Component.LEFT_ALIGNMENT); 
       contentPane.add(label); 
       contentPane.add(new JSlider()); 

       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

Respuesta

8

Básicamente, no se puede tener diferentes alineaciones en BoxLayout, desde How To Use BoxLayout

En general, todos los componentes controlados por un objeto de arriba a abajo BoxLayout deben tener la misma alineación X .

Editar

Por lo general, no está documentado, que por defecto de alineación de un tipo de componente ha (JSlider está centrada por defecto, me incorrectamente pensaron que un JLabel se centra mientras está alineado a la izquierda ;-) Uno la opción es mantener una lista en algún lugar (dooooh ...), otra es simplemente obligarlos a todos a la misma alineación al agregar.

O utilice un administrador de diseño de terceros, que no tiene esta mezcla de diseño y alineación bastante inigualable (para mí).

+0

leí esa página, pero pensé que el deslizador "no tiene" una alineación. ¿Cuál es la mejor manera de imponer la misma alineación en todos los componentes? – Mizipzor

+0

Unintuitive sería la subestimación del día. Pero al menos lo tengo funcionando ahora. ¡Gracias! :) – Mizipzor

0

BoxLayout tiene un comportamiento extraño. Trate de usar GridBagLayout lugar:

https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

public class Aligment { 
    public static void main(String[] args) { 

    final JPanel root = new JPanel(new GridBagLayout()); 
    root.setPreferredSize(new Dimension(500, 400)); 

    root.add(new JLabel("LEFT"), new GridBagConstraints() {{ 
     gridx = 0; 
     gridy = 0; 
     anchor = PAGE_START; 
    }}); 
    root.add(new JLabel("CENTER"), new GridBagConstraints() {{ 
     gridx = 1; 
     gridy = 1; 
     anchor = CENTER; 
     weightx = 1.0; // fill Width 
    }}); 
    root.add(new JLabel("RIGHT"), new GridBagConstraints() {{ 
     gridx = 2; 
     gridy = 2; 
     anchor = LINE_END; 
    }}); 
    // hack: Push all rows to Top 
    root.add(Box.createVerticalGlue(), new GridBagConstraints() {{ 
     gridx = 0; 
     gridy = 3; 
     weighty = 1.0; // fill Height 
    }}); 

    new JFrame() { 
     { 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setContentPane(root); 
     pack(); 
     setLocationRelativeTo(null);; 
     } 
    }.setVisible(true); 
    } 
}