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

Rog*_*ach 9 java swing scala scala-swing

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

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

我怎样才能解决这个问题?

cam*_*ckr 5

我想把它放在一个滚动窗格内,可以在垂直方向上滚动,并且具有固定的宽度

您可以使用Wrap Layout.

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


Hei*_*bug 4

您可以使用 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"));
Run Code Online (Sandbox Code Playgroud)

这当然将使用添加的每个组件的首选大小。如果您想修改 JPanel 的首选大小,请扩展它并覆盖 getPreferredSize:

class MyPanel extends JPanel(){
    public Dimension getPreferredSize(){
         return new Dimension(100,100);
    }
} 
Run Code Online (Sandbox Code Playgroud)

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

请批评我的回答,我不确定它是否完全正确,我很想听到反对意见,以便知道我是否理解了这个问题。

  • “这当然将使用添加的每个组件的首选大小”当然是错误的(或者不完全正确,这在一定程度上取决于“使用”的含义;-)布局管理器可以根据给出的提示自由地做任何他们喜欢的事情由组件。重写 getXXSize 是正确的方向,尽管硬编码值几乎和设置它们一样糟糕。只需使用一个合适的 LayoutManager 并使用您需要的任何大小规则对其进行配置即可。 (4认同)