首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在ScrollPane中创建流体2列GridLayout?

如何在ScrollPane中创建流体2列GridLayout?
EN

Stack Overflow用户
提问于 2019-11-23 13:55:30
回答 2查看 247关注 0票数 0

在过去的两个小时里,我做了大量的搜索,我已经放弃了。下面的图片显示了我正在努力实现的目标(不要评判我的画已经很晚了,我很快就完成了):

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

目前,我有一个JScrollPane和一个带有GridLayoutJPanel,以及一个包含带有FlowLayout的网格的JPanel。作为测试,我向网格添加了10个按钮。下面是我当前的代码:

代码语言:javascript
运行
复制
// 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,并添加一些垂直粘合...

代码语言:javascript
运行
复制
// 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());

我还创建了自己的临时按钮类,用于设置首选大小以使用最小大小:

代码语言:javascript
运行
复制
public class TempButton extends JButton {

    public PLTempButton(String msg) {
        super(msg);
        this.setPreferredSize(this.getMinimumSize());
    }

}

这导致了以下结果:

这好多了,但仍然有一个问题。如果没有足够的按钮使JScrollPane滚动,则按钮高度不一致,并且在垂直调整窗口大小时会调整大小。为什么?

显然,当我添加100个按钮时,它们使用它们的首选大小:

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

EN

回答 2

Stack Overflow用户

发布于 2019-11-23 14:18:32

1)如何在ScrollPane中获取GridLayout?

JScrollPane中创建指向JPanel

  1. Wrap GridLayoutJPanel
    1. Apply aGridLayout

例如

代码语言:javascript
运行
复制
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个数的roe

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

这是一个宽泛的答案,你可以:

  • 利用复合布局的水平和垂直间距属性,并调整相应布局管理器(如GridBagLayout)

)的插图

建议

我建议通过阅读Laying Out Components Within a Container来更好地理解布局管理器。

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

我还建议您通读How to Use Scroll Panes,因为您正在询问有关API的基本问题,这些问题在教程中有更好的介绍

票数 1
EN

Stack Overflow用户

发布于 2019-11-23 14:50:14

下面的mre演示了如何使用由JScrollPane扭曲的GridLayout创建JPanel,并设置其水平和垂直间隙。

Jpanel是使用BorderLayout ( JFrame内容窗格的默认布局管理器)添加的,它允许展开:

代码语言:javascript
运行
复制
import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class SwingMain {

    private String text ="Growing ";
    private JPanel grid;
    private JFrame f;

    SwingMain() {
        creategui();
    }

    void creategui(){

        f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocationRelativeTo(null);
        JButton addComponentBtn = new JButton("Add Component");
        addComponentBtn.addActionListener(e-> addComponent());
        f.add(addComponentBtn, BorderLayout.PAGE_START);
        grid = new JPanel(new GridLayout(0, 2, 10, 10)); //any number of rows, 2 columns, H and V gap
        f.add(new JScrollPane(grid), BorderLayout.CENTER);
        f.pack();
        f.setVisible(true);
    }

    void addComponent() {
        grid.add(new JLabel(text) );
        text +="."; //make text longer so JLable grows
        f.pack();
    }

    public static void main(String[] args) {
        new SwingMain();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59004966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档