2017-05-04 30 views
2

我看How To Use BoxLayout文件,其中明确表示,如何使用BoxLayout将组件拉伸到整行上?

如果没有什么组件的最大宽度?在这种情况下,如果所有组件都具有相同的X对齐,则所有组件均为 ,其宽度与其容器一样宽。

我们假设我们将大量JButton实例添加到JPanel。如果这些按钮的最大宽度是并且我们在所有这些按钮上调用setAlignmentX(Component.LEFT_ALIGNMENT) - 然后这些按钮中的每一个都应该在整个行上延伸。该文档甚至使用下面的图片说明了这一点。

enter image description here

我不能得到这个工作!

我试过在按钮上试过setMaximumSize(null)和setMaximumSize(new Dimension(-1,-1))setMaximumSize(new Dimension(0,0)),但没有给我描述的行为。

如果没有什么组件的最大宽度:

什么excactly当它说没有文件的意思

什么是无最大宽度?


我已经能够生产的最好的是下面。阅读文档我会期望按钮应该能够在整个行上展开。我知道我也可以使用其他布局管理器,但我希望通过BoxLayout来实现这一点(授予文档是正确的/我已经理解了文档的权利)。

enter image description here

public class CustomList extends JPanel { 

    private final Box box = Box.createVerticalBox(); 

    public CustomList() { 
     for (int i = 0; i < 10; i++) { 
      JButton b = new JButton("Button item" + i); 
      //b.setMaximumSize(new Dimension(0,0)); 
      b.setAlignmentX(Component.LEFT_ALIGNMENT); 
      box.add(b); 
     } 
     setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); 
     add(box, BorderLayout.CENTER); 
    } 

    public static void main(String[] args) { 
     CustomList l = new CustomList(); 
     l.setSize(200, 200); 
     l.setBackground(Color.red); 

     JFrame frame = new JFrame("Vertical Box"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(l, BorderLayout.CENTER); 
     frame.setSize(300, 200); 
     frame.setVisible(true); 
    } 

} 
+0

我看到,如果我用JPanel替换JButton - 不管是否设置了最大大小 - 那么每个JPanel将跨越整个行。 – sbrattla

回答

2

你的按钮确实有一个最大宽度。

你可以做的是在你的循环中创建JPanel对象BorderLayout,将每个按钮添加到每个面板(至BorderLayout.CENTER,这是默认情况下)。

BorderLayout.CENTER不关心它的子Component的最大尺寸,所以你最终有JPanel,其全部内容通过JButton填补。

由于JPanel本身具有的new Dimension(Short.MAX_VALUE, Short.MAX_VALUE)巨大的默认最大大小(这是宽度= 32767,身高= 32767 !!),这是Component默认的最大尺寸,你会得到预期的结果:

public CustomList() { 
    for (int i = 0; i < 10; i++) { 

     JPanel panel = new JPanel(new BorderLayout()); 
     JButton b = new JButton("Button item" + i); 
     //b.setMaximumSize(new Dimension(0,0)); 
     b.setAlignmentX(Component.LEFT_ALIGNMENT); 
     panel.add(b); 
     box.add(panel); 
    } 
    setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); 
    add(box, BorderLayout.CENTER); 
} 
+1

谢谢,这与我在用JPanel替换JButton时看到的结果非常吻合 - 面板横跨整行。谢谢! – sbrattla

+0

作为附注:您提到按钮的最大宽度。那很好。但是,一个组件的最大宽度是什么也没有。这些文档意味着什么? – sbrattla

+1

嗯,我想“无”是误导,它应该意味着“不计算”,但即使“JPanel”实际上有一个默认的最大尺寸,但它是巨大的,可以被认为没有最大尺寸。从'Component'的源代码中,默认的最大尺寸是'new Dimension(Short.MAX_VALUE,Short.MAX_VALUE)',它是width = 32767,height = 32767。 – Berger