【问题标题】:How to tell GridBagLayout not to resize my components如何告诉 GridBagLayout 不要调整我的组件大小
【发布时间】:2013-11-01 07:44:12
【问题描述】:

我在垂直 JSplitPane 中有 JPanel。 JPanel 包含 jlabels 和 jtextfields。当我通过移动 JSplitPane 的分隔线来缩小 JPanel 的高度时 jpanel 中的所有组件都会自行调整大小。当父 jpanel 的高度缩小时,如何告诉他们不要调整大小。 我无法调整 JPanel 的 minSize 大小,因为 JSplitPane 无法移动分隔线。

JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
        splitPane.setDividerSize(10);
        splitPane.setOneTouchExpandable(true);

        JPanel searchPanel = createSearchPanel();
        splitPane.setDividerLocation(searchPanel.getPreferredSize().height + 5);
        splitPane.setTopComponent(searchPanel);

如您所见,有searchPanel。来看看吧:

JPanel searchPanel = new JPanel(new GridBagLayout()) {
            Dimension minSize = new Dimension(200, 0);

            @Override
            public Dimension getMinimumSize() {
                return minSize;
            }
        };
        searchPanel.setBorder(BorderFactory.createTitledBorder("Search query"));
        GridBagConstraints gbc = new GridBagConstraints(0, 0, 1, 1, 0, 0,
                GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL,
                new Insets(5, 2, 5, 3), 0, 0);
        searchPanel.add(eventLabel, gbc);
        gbc.gridx = 1;
        gbc.gridwidth = 3;
        searchPanel.add(eventLabelField, gbc);
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.gridwidth = 1;
        searchPanel.add(timestampLabel, gbc);
        gbc.gridx = 1;
        searchPanel.add(timestampStartField, gbc);
        gbc.gridx = 2;
        searchPanel.add(timestammpToLabel, gbc);
        gbc.gridx = 3;
        searchPanel.add(timestampEndField, gbc);
        gbc.gridx = 0;
        gbc.gridy = 2;
        searchPanel.add(locationLabel, gbc);
        gbc.gridx = 1;
        gbc.gridy = 2;
        gbc.gridwidth = 3;
        searchPanel.add(locationField, gbc);
        gbc.gridx = 0;
        gbc.gridy = 3;
        gbc.gridwidth = 1;
        searchPanel.add(durationMagnitudeLabel, gbc);
        gbc.gridx = 1;
        gbc.gridy = 3;
        searchPanel.add(durationMagnitudeMinField, gbc);
        gbc.gridx = 2;
        searchPanel.add(durationToLabel, gbc);
        gbc.gridx = 3;
        searchPanel.add(durationMagnitudeMaxField, gbc);
        gbc.gridx = 1;
        gbc.gridy = 4;
        gbc.gridwidth = 2;
        gbc.anchor = GridBagConstraints.PAGE_END;
        gbc.weighty = 1.0;
        gbc.ipadx = 2;
        gbc.ipady = 2;
        gbc.insets = new Insets(15, 0, 0, 0);
        searchPanel.add(searchButton, gbc);

当我向上移动垂直分隔线时,searchPanel 的高度会缩小,组件看起来像:

你看到 jtextFields 比我向上移动分隔线后要小得多

请帮帮我。

【问题讨论】:

    标签: java swing jsplitpane


    【解决方案1】:

    我已更改您的代码。使用 GridBagConstraint 的 weightx 属性和 GridBagConstraints.HORIZONTAL 填充,它可以帮助组件正确填充它们的单元格。 示例代码:

        JPanel searchPanel = new JPanel(new GridBagLayout()) {
            Dimension minSize = new Dimension(200, 0);
    
            @Override
            public Dimension getMinimumSize() {
                return minSize;
            }
        };
        searchPanel.setBorder(BorderFactory.createTitledBorder("Search query"));
        GridBagConstraints gbc = new GridBagConstraints(0, 0, 1, 1, 0, 0,
                GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL,
                new Insets(5, 2, 5, 3), 0, 0);
        searchPanel.add(new JLabel("1"), gbc);
        gbc.gridx = 1;
        gbc.gridwidth = 3;
        gbc.weightx = 1;
        searchPanel.add(new JTextField(), gbc);
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.gridwidth = 1;
        gbc.weightx = 0;
        searchPanel.add(new JLabel("1"), gbc);
        gbc.gridx = 1;
        gbc.weightx = 1;
        searchPanel.add(new JTextField(), gbc);
        gbc.gridx = 2;
        gbc.weightx = 0;
        searchPanel.add(new JLabel("1"), gbc);
        gbc.gridx = 3;
        gbc.weightx = 1;
        searchPanel.add(new JTextField(), gbc);
        gbc.gridx = 0;
        gbc.gridy = 2;
        gbc.weightx = 0;
        searchPanel.add(new JLabel("1"), gbc);
        gbc.gridx = 1;
        gbc.gridy = 2;
        gbc.gridwidth = 3;
        gbc.weightx = 1;
        searchPanel.add(new JTextField(), gbc);
        gbc.gridx = 0;
        gbc.gridy = 3;
        gbc.gridwidth = 1;
        gbc.weightx = 0;
        searchPanel.add(new JLabel("1"), gbc);
        gbc.gridx = 1;
        gbc.gridy = 3;
        gbc.weightx = 1;
        searchPanel.add(new JTextField(), gbc);
        gbc.gridx = 2;
        gbc.weightx = 0;
        searchPanel.add(new JLabel("1"), gbc);
        gbc.gridx = 3;
        gbc.weightx = 1;
        searchPanel.add(new JTextField(), gbc);
        gbc.gridx = 1;
        gbc.gridy = 4;
        gbc.gridwidth = 2;
        gbc.anchor = GridBagConstraints.PAGE_END;
        gbc.weighty = 1.0;
        gbc.ipadx = 2;
        gbc.ipady = 2;
        gbc.insets = new Insets(15, 0, 0, 0);
        gbc.weightx = 0;
        searchPanel.add(new JButton("b"), gbc);
        return searchPanel;
    

    观看docs How to use GridBagLayout

    结果:

    编辑:抱歉,我使用了糟糕的标签名称)

    【讨论】:

    • 我很喜欢你!
    • 谢谢,对我来说 GridBagLayout 它是强大的布局,但真正阅读有关 GridBagConstraint 属性的文档,它会在未来帮助你。
    【解决方案2】:

    在底部添加一个虚拟JPanel,并为JPanel 设置weightY=1。所有其余部分的权重Y=0。因此,在高度增加时,所有额外的像素都会针对虚拟JPanel

    【讨论】:

    • 但正如你所见,我降低(缩小)顶部面板的高度。然后它的组件变得非常小。还是谢谢!
    • 它有效,但不适用于这种情况!它可以锚定到所有组件的顶部。我使用 JLabel 而不是 JPanel。但是对于这个问题,它是行不通的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 2014-10-01
    • 2014-02-20
    • 2014-07-08
    相关资源
    最近更新 更多