2012-02-10 10 views
5

Nel codice seguente, chiamando setAlignmentX con Component.LEFT_ALIGNMENT mi aspettavo di ottenere un'etichetta allineata a sinistra su un cursore centrato. Per qualche motivo l'etichetta è anche centrata, apparentemente a prescindere da quale valore è passato a setAlignmentX.Java Swing BoxLayout ignorando AlignmentX

Quale valore devo passare a setAlignmentX per farlo allineare a sinistra?

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); 
      } 
     }); 
    } 
} 

risposta

8

In sostanza, non si può avere diversi allineamenti in BoxLayout, da How To Use BoxLayout

In generale, tutti i componenti controllati da un oggetto da cima a fondo BoxLayout dovrebbero avere lo stesso allineamento X .

Modifica

In genere, non è documentato, che di default l'allineamento di un tipo di componente è (JSlider è centrato per impostazione predefinita, mi ha erroneamente pensato che un JLabel fosse centrato mentre si è allineato a sinistra ;-) One l'opzione è di tenere una lista da qualche parte (dooooh ...), un'altra è semplicemente forzarli tutti allo stesso allineamento sull'aggiunta.

Oppure utilizzare un layoutManager di terze parti, che non ha questo mix (in me) non intuitivo di layout e allineamento.

+0

ho letto quella pagina ma ho pensato che il dispositivo di scorrimento "non ha avuto" un allineamento. Qual'è il modo migliore per applicare lo stesso allineamento su tutti i componenti? – Mizipzor

+0

Non intuitivo sarebbe l'eufemismo del giorno. Ma almeno ho funzionato ora. Grazie! :) – Mizipzor

0

BoxLayout ha un comportamento strano. Provare a utilizzare GridBagLayout invece:

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); 
    } 
}