2012-02-10 71 views
5

在下面的代码中,通过调用setAlignmentXComponent.LEFT_ALIGNMENT我期望在中心滑块上获得左对齐的标签。出于某种原因,标签也是居中的,看起来不管传递给setAlignmentX的值是什么。Java Swing BoxLayout忽略AlignmentX

我必须传递给setAlignmentX以使其左对齐的值是多少?

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

回答

8

基本上,不能有不同的对准中的BoxLayout,从How To Use BoxLayout

一般而言,所有由顶至底的BoxLayout 对象控制的部件应具有相同的X对准。

编辑

典型地,它是没有记录其默认对准的组件类型已经(JSlider的被默认为中心,我错误地认为,虽然这是左对齐;-)一个一个JLabel都集中选项是在某个地方保留一个列表(dooooh ...),另一个是简单地强制它们在添加时相同的对齐。

或者使用第三方layoutManager,它没有这种对于我来说布局和对齐的unintuitve混合。

+0

我读的页面,但我认为滑盖“没有”的定位。什么是在所有组件上执行相同对齐的最佳方式? – Mizipzor 2012-02-10 13:56:23

+0

不直观的是当天的轻描淡写。但至少我现在已经开始工作了。谢谢! :) – Mizipzor 2012-02-10 14:17:46

0

BoxLayout有奇怪的行为。尝试使用GridBagLayout代替:

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