首页 > 解决方案 > 如何在 ScrollPane 中创建流畅的 2 列 GridLayout?

问题描述

在过去的两个小时里,我进行了大量搜索,但我已经放弃了。下图显示了我正在努力实现的目标(不要判断我的画太晚了,我很快就画好了):

在此处输入图像描述

基本上,我希望 JScrollPane 有一个带有 2 列 GridLayout 的 JPanel,并且当我添加元素时,我希望 GridLayout 向下扩展。我希望元素使用它们的首选大小并且不在 GridLayout 中扩展。

目前我有 aJScrollPane和 aJPanel和 a GridLayout,并且 aJPanel包含带有 a 的网格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 个按钮时,它们会使用自己喜欢的大小:

在此处输入图像描述

也许我只是不理解最小、首选和最大尺寸之间的区别?但我希望按钮使用它们设置的高度,即使没有足够的高度使滚动窗格滚动。我能做些什么来解决这个问题?

标签: javaswinglayout-managerjscrollpanegrid-layout

解决方案


1) 我什至如何在 ScrollPane 中获得 GridLayout?

  1. 创建一个JPanel
  2. 将 aGridLayout应用于JPanel
  3. 包裹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 个 roes 配置的

3)如何为组件添加“边距”?

这是一个广泛的答案,您可以:

  • 利用水平和垂直间隙属性GridLayout
  • 使用复合布局并调整适当布局管理器的插图(如GridBagLayout

建议

我建议通读在容器中布局组件以更好地理解布局管理器。

请记住,您并没有坚持使用一个。

我还建议您阅读如何使用滚动窗格,因为您正在询问有关 API 的基本问题,这些问题在教程中得到了更好的介绍


推荐阅读