2010-02-22 56 views
4

可以解释对象有人可以解释为什么在这里缩进文本“Options”?这在BoxLayout中看起来像一个bug。 TIA为什么使用Swing BoxLayout

import javax.swing.*; 
import java.awt.*; 

public class BoxLayoutIssue { 

    public static void main(String[] args) { 

     JFrame f = new JFrame(); 
     f.setSize(240, 250); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel panel = new JPanel(); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 

     JLabel label = new JLabel("Option"); 
     panel.add(label); 

     JLabel a = new JLabel("A"); 
     JLabel b = new JLabel("B"); 
     JLabel c = new JLabel("C"); 
     JLabel d = new JLabel("D"); 
     JLabel e = new JLabel("E"); 

     Box box = Box.createVerticalBox(); 
     box.add(a); 
     box.add(b); 
     box.add(c); 
     box.add(d); 
     box.add(e); 

     JScrollPane jscrlpBox = new JScrollPane(box); 
     jscrlpBox.setPreferredSize(new Dimension(140, 90)); 
     panel.add(jscrlpBox); 

     f.add(panel); 

     f.setVisible(true); 
    } 
} 
+0

与您的问题无关 - 您应该在AWT事件线程中执行此操作。请参阅SwingUtilities.invokeLater(Runnable)。 – 2010-02-22 01:20:01

+0

也许。 :)我只是一起鞭打这件事来解释我遇到的问题。 – sproketboy 2010-02-23 10:07:56

回答

4

这里的问题在于JLabel将其右侧边缘与面板的中心对齐,而滚动窗格则将其中心与面板中心对齐。

我能够加入两行解决这个问题,既labeljscrlpBox的水平对齐方式设置为Component.LEFT_ALIGNMENT

JLabel label = new JLabel("Option"); 
label.setAlignmentX(Component.LEFT_ALIGNMENT); // Added 

panel.add(label); 

JLabel a = new JLabel("A"); 
JLabel b = new JLabel("B"); 
JLabel c = new JLabel("C"); 
JLabel d = new JLabel("D"); 
JLabel e = new JLabel("E"); 

Box box = Box.createVerticalBox(); 
box.add(a); 
box.add(b); 
box.add(c); 
box.add(d); 
box.add(e); 

JScrollPane jscrlpBox = new JScrollPane(box); 
jscrlpBox.setPreferredSize(new Dimension(140, 90)); 
panel.add(jscrlpBox); 
jscrlpBox.setAlignmentX(Component.LEFT_ALIGNMENT); // Added 

在一般情况下,故障排除这样的事情的时候,我尝试添加一个颜色鲜艳的线边界到组件(在这种情况下,label),这些不是我想要它们的地方。那时候我意识到它正在用与另一个组件用于排列其中心的线相同的线来排列它的右边缘。

+0

谢谢。这是一个很好的提示。 – sproketboy 2010-02-22 01:10:39

2

阅读Swing教程中关于Using a Box Layout的部分。有一些例子试图解释每个组件的“X对齐”如何影响布局。

如果您描述了您正在尝试做什么,或者您期望发生什么,也许我们可以建议使用不同的布局管理器组合。

+0

是的谢谢。我会再读一遍。看起来左对齐会默认发生。 :) – sproketboy 2010-02-22 01:12:10

+0

你当然不是第一个假设的人。如果每种类型的组件都默认具有*相同的*对齐方式,也可能会更好,但即便如此,情况也不例外。 – 2010-02-22 01:24:39

+0

是的,谢谢。我可能会创建组件的子类来设置我想要的所有默认值。 – sproketboy 2010-02-23 10:09:38