在过去的两个小时中,我已经进行了大量的搜索工作,但我已经放弃了。下图显示了我要实现的目标(请不要判断我的绘图是否太迟了,我很快就将其绘制在了绘画中):
基本上,我希望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个按钮时,它们将使用其首选大小:
也许我只是不了解最小,首选和最大大小之间的区别?但是我希望这些按钮使用设置的高度,即使它们不足以导致滚动窗格滚动也是如此。我该怎么做才能解决此问题?