java - 如何在 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 个按钮时,它们会使用自己喜欢的大小:
也许我只是不理解最小、首选和最大尺寸之间的区别?但我希望按钮使用它们设置的高度,即使没有足够的高度使滚动窗格滚动。我能做些什么来解决这个问题?
解决方案
1) 我什至如何在 ScrollPane 中获得 GridLayout?
- 创建一个
JPanel
- 将 a
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 个 roes 配置的
3)如何为组件添加“边距”?
这是一个广泛的答案,您可以:
- 利用水平和垂直间隙属性
GridLayout
- 使用复合布局并调整适当布局管理器的插图(如
GridBagLayout
)
建议
我建议通读在容器中布局组件以更好地理解布局管理器。
请记住,您并没有坚持使用一个。
我还建议您阅读如何使用滚动窗格,因为您正在询问有关 API 的基本问题,这些问题在教程中得到了更好的介绍
推荐阅读
- java - 从第一次单击按钮开始,文本不会改变
- html - 嵌套a有什么缺点
- c# - 如何在 Windows Server 2019 上的 App 中设置 Cron
- eclipse - 如何从 config.ini 文件 eclipse 中获取字段
- c# - INSTEAD OF INSERT 设置的主键在实体框架中抛出错误(ASP.NET 框架 c#)
- php - 在 PHP 文件中包含来自另一个文件的 HTML 标记
- azure - Azure 存储:如何使用 Rest API 上传 .pdf 或 .docx 文件
- oracle - 如何使用 where day>to_date(20200531) 快速创建物化视图刷新
- amazon-web-services - 如何在迁移和复制正在进行的更改时启用 AWS DMS 使其仅适用于插入操作,但不适用于任何其他删除、删除操作
- pdf - SSRS 报告导出为 PDF - 添加注释