如何仅使用流布局设置Panel的首选宽度?

时间:2011-10-03 09:25:25

标签: java swing scala scala-swing

我有一个带流程布局的面板,它可以包含可变数量的项目 - 从1到2000.我想将它放在滚动窗格内,可以垂直方向滚动,并且具有固定宽度。问题是,当我将面板的首选大小设置为类似(800,600)时,某些项目丢失,并且没有滚动。如果我设置了滚动窗格的首选大小,那么流窗格中的所有元素都会放在一个很长的行上。

在任何元素上设置最大大小似乎什么都不做 - 布局管理器忽略它。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

  

我想将它放在滚动窗格中,可以垂直方向滚动,并且具有固定宽度

您可以使用Wrap Layout进行此操作。

不要设置面板​​的首选大小。但是您可以设置滚动窗格的首选大小,以便frame.pack()方法起作用。

答案 1 :(得分:3)

您可以使用BoxLayout执行此操作:

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

JScrollPane pane = new JScrollPane(verticalPane);

//add what you want to verticalPane
verticalPane.add(new JButton("foo"));
verticalPane.add(new JButton("bar"));

这当然会使用添加的每个组件的首选大小。如果要修改JPanel等首选大小,请对其进行扩展并覆盖getPreferredSize:

class MyPanel extends JPanel(){
    public Dimension getPreferredSize(){
         return new Dimension(100,100);
    }
} 

注意:BoxLayout将考虑getPreferredSize,其他LayoutManager可能不会。

请批评我的回答,我不确定这是完全正确的,我很想听到异议,以便知道我是否理解这个问题。