在过去的两个小时中,我已经做了很多搜索工作,但我已经放弃了。下图显示了我要实现的目标(请不要判断我的绘图是否太迟了,我很快就用油漆绘制了它):
[基本上,我希望JScrollPane具有一个带有2列GridLayout的JPanel,并且当我添加元素时,我希望GridLayout向下扩展。我希望元素使用其“首选大小”而不在GridLayout中扩展。
当前,我有一个JScrollPane
和一个JPanel
和一个GridLayout
,以及一个JPanel
,其中包含带有FlowLayout
的网格。作为测试,我向网格添加了10个按钮。这是我当前的代码:
// Setup main panel
JPanel pnlUsers = new JPanel(new GridLayout(0, 2));
pnlUsers.setOpaque(true);
pnlUsers.setBackground(Color.GREEN);
// Setup GridLayout Container
JPanel pnl2 = new JPanel();
pnl2.setOpaque(false);
pnl2.add(pnlusers);
// Setup scrollpane
JScrollPane scrUsers = new JScrollPane(pnl2);
scrUsers.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
scrUsers.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrUsers.setOpaque(false);
scrUsers.getViewport().setOpaque(false);
scrUsers.setBorder(null);
// Add users
for (int i = 0; i < 10; i++) {
pnlUsers.add(new JButton("Button " + (i + 1));
}
这提供了很好的效果,按钮使用了它们的首选大小,如下图所示:
不幸的是,按钮仍然没有填充水平空间。因此,我尝试将pnl2改为BoxLayout并添加一些垂直胶水...
// Setup GridLayout Container
JPanel pnl2 = new JPanel();
pnl2.setLayout(new BoxLayout(pnl2, BoxLayout.Y_AXIS));
pnl2.setOpaque(false);
pnl2.add(pnlusers);
pnl2.add(Box.createVerticalGlue());
我还创建了自己的临时按钮类,该类将首选大小设置为使用最小大小:
public class TempButton extends JButton {
public PLTempButton(String msg) {
super(msg);
this.setPreferredSize(this.getMinimumSize());
}
}
导致以下结果:
这好多了,但是仍然有问题。如果没有足够的按钮导致JScrollPane滚动,则按钮的高度不一致,并且在垂直调整窗口大小时会调整大小。为什么?
显然,当我添加100个按钮时,它们将使用其首选大小:
也许我只是不了解最小,首选和最大大小之间的区别?但是我希望这些按钮使用设置的高度,即使它们不足以导致滚动窗格滚动也是如此。我该怎么做才能解决此问题?
1)如何在ScrollPane中获得GridLayout?
JPanel
GridLayout
应用于JPanel
JPanel
包装在JScrollPane
中例如
JPanel panel = new JPanel(new GridLayout(0, 2));
JScrollPane scrollPane = new JScrollPane(panel);
// Add the scroll pane to what ever parent container you're using
2)我如何说GridLayout可以水平扩展,包括添加的组件?
对于问题的前面所有部分,这都是没有意义的,您说过“并且随着我添加的内容的增加,慢慢地向下扩展”]]
话虽如此,“基本”答案是,您配置GridLayout
并使其完成工作。上面的示例配置为2列n个子项。
3)如何为组件添加“保证金”?
这是一个广泛的答案,您可以:
GridLayout
的水平和垂直间隙属性GridBagLayout
)我建议您通读Laying Out Components Within a Container,以更好地了解布局管理器。
记住,您不习惯使用一个。
[我也建议您在询问有关API的基本问题时通读How to Use Scroll Panes,这些问题最好在本教程中介绍
以下示例演示了如何创建一个JPanel
,其中GridLayout
被JScrollPane
扭曲,并设置其水平和垂直间隙。Jpanel
是使用BorderLayout
(JFrame
内容窗格的默认布局管理器)添加的,它可以展开: