【问题标题】:How to stop JTextField being resized because of weightx=1f?由于weightx = 1f,如何阻止JTextField被调整大小?
【发布时间】:2013-11-01 16:52:23
【问题描述】:

当我缩小 JPanel 的高度时,我遇到了 GridBagLayout 的问题。 一旦我解决了这个问题,我在填充同一个 jpanel 的宽度时遇到了问题。

现在的问题是所有组件的大小都调整为覆盖 jpanel 宽度所需的宽度。但是如果我改变他们的 weightx 或者我改变填充属性,那么我会遇到 jpanel 高度缩小的新问题。

请复制粘贴该类以查看:

public class DateFormatDemo extends JFrame
{
    JLabel eventLabel = new JLabel("Label : ", SwingConstants.LEFT);
    JTextField eventLabelField = new JTextField("myFirstEvent", 30);
    JLabel timestampLabel = new JLabel("Time stamp : ");
    JLabel timestammpToLabel = new JLabel(" to ");
    JTextField timestampStartField = new JTextField("2011-11-30 12:30:45", 15);
    JTextField timestampEndField = new JTextField("2011-10-12 07:22:50", 15);
    JLabel durationMagnitudeLabel = new JLabel("Duration Magnitude : ");
    JTextField durationMagnitudeMinField = new JTextField("2011-10-12 09:12:40", 15);
    JLabel durationMagnitudeToLabel = new JLabel(" to ");
    JTextField durationMagnitudeMaxField = new JTextField("2011-10-12 11:13:34", 15);
    JButton searchButton = new JButton("search");

    public DateFormatDemo() {
        JPanel searchPanel = new JPanel(new GridBagLayout()) {
            Dimension minSize = new Dimension(200, 0);
            Border border = BorderFactory.createCompoundBorder(BorderFactory.createTitledBorder("Search query"),
                    BorderFactory.createEmptyBorder(20, 5, 10, 5));

            @Override
            public Dimension getMinimumSize() {
                return minSize;
            }

            @Override
            public Border getBorder() {
                return border;
            }
        };

        GridBagConstraints gbc = new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.LINE_START,
                GridBagConstraints.BOTH, new Insets(5, 2, 5, 3), 0, 0);
        searchPanel.add(eventLabel, updateGridBagConstraints(gbc, 0, 0, 1, 1, 0f, 0f));
        searchPanel.add(eventLabelField, updateGridBagConstraints(gbc, 1, 0, 3, 1, 1f, 0f));
        searchPanel.add(timestampLabel, updateGridBagConstraints(gbc, 0, 1, 1, 1, 0f, 0f));
        searchPanel.add(timestampStartField, updateGridBagConstraints(gbc, 1, 1, 1, 1, 1f, 0f));
        searchPanel.add(timestammpToLabel, updateGridBagConstraints(gbc, 2, 1, 1, 1, 0f, 0f));
        searchPanel.add(timestampEndField, updateGridBagConstraints(gbc, 3, 1, 1, 1, 1f, 0f));
        searchPanel.add(durationMagnitudeLabel, updateGridBagConstraints(gbc, 0, 2, 1, 1, 0f, 0f));
        searchPanel.add(durationMagnitudeMinField, updateGridBagConstraints(gbc, 1, 2, 1, 1, 1f, 0f));
        searchPanel.add(durationMagnitudeToLabel, updateGridBagConstraints(gbc, 2, 2, 1, 1, 0f, 0f));
        searchPanel.add(durationMagnitudeMaxField, updateGridBagConstraints(gbc, 3, 2, 1, 1, 1f, 0f));
        gbc = updateGridBagConstraints(gbc, 0, 4, 3, 1, 0f, 0f);
        gbc.fill = GridBagConstraints.NONE;
        gbc.anchor = GridBagConstraints.CENTER;
        gbc.ipadx = 5;
        gbc.ipady = 5;
        gbc.insets = new Insets(15, 0, 0, 0);
        searchPanel.add(searchButton, gbc);

        super.getContentPane().add(searchPanel);
        super.pack();
        super.setVisible(true);
    }

    private GridBagConstraints updateGridBagConstraints(GridBagConstraints gbc, int gridx, int gridy, int gridwidth,
            int gridheight, float weightx, float weighty) {
        gbc.gridx = gridx;
        gbc.gridy = gridy;
        gbc.gridwidth = gridwidth;
        gbc.gridheight = gridheight;
        gbc.weightx = weightx;
        gbc.weighty = weighty;
        return gbc;
    }

    public static void main(String[] args) throws ParseException {
        new DateFormatDemo();
    }
}

如果您调整 Jpanel 的宽度,您会看到文本字段的大小也被调整了。

你也可以建议关于这个jpanel的边框吗?如您所见,标题边框与最上面的标签 eventLabel 太接近。

非常感谢!

【问题讨论】:

  • 你的问题只是边框和标签?
  • 如果您以后需要帮助,请开始接受您之前问题的答案。
  • 您能告诉我们您究竟需要什么帮助吗?除了标注的边框外,尚不清楚您需要什么样的帮助。如果您可以提供所需外观的屏幕截图并描述组件应具有的行为,那就太好了。
  • 我的问题是,当我移动分隔线或调整面板大小时,我无法告诉我的组件不要调整大小。另外,标题边框存在问题,因为它太窄了。

标签: java swing gridbaglayout


【解决方案1】:

如果您调整 Jpanel 的宽度,您会看到文本字段的大小已调整 也是。

网格包布局管理器将列的权重计算为列中所有组件的最大值weightx。如果生成的布局在水平方向上小于它需要填充的区域,则额外的空间将按其权重按比例分配到每一列。权重为zero 的列不接收额外空间。因此,将文本字段的wieghtx 设置为zero,您不希望调整其宽度。

编辑: GridBagLayout 尊重由它布置的组件的最小和首选尺寸。尝试设置它们,它应该可以工作。

【讨论】:

  • 你是对的。这里又出现了新的老问题。当我缩小该面板的高度时,我的文本字段和按钮变得如此之小以至于无法查看。
  • 你是否试图缩小高度,甚至超过它在屏幕上显示的尺寸?
  • 不是我试图让高度越来越小,有一刻我的文本字段变成了 1px 宽。然后我再次增加高度,我的文本文件再次自动变成正确的大小。要看到这一点,只需尝试在 GridBagConstraints 构造函数中将填充属性设置为 NONE
  • @VolodymyrLevytskyi,编辑了答案。核实。但这只是一个临时解决方案
  • 不,不是因为我对 GridBagConstraints 使用 fill Both。
【解决方案2】:

我不建议你这样做:

JPanel searchPanel = new JPanel(new GridBagLayout()) {
        Dimension minSize = new Dimension(200, 0);
        Border border = BorderFactory.createCompoundBorder(BorderFactory.createTitledBorder("Search query"),
                BorderFactory.createEmptyBorder(20, 5, 10, 5));

        @Override
        public Dimension getMinimumSize() {
            return minSize;
        }

        @Override
        public Border getBorder() {
            return border;
        }
    };

为此,请按以下方式进行:

JPanel searchPanel = new JPanel(new GridBagLayout());
Border border = BorderFactory.createCompoundBorder(BorderFactory.createTitledBorder("Search query"),
            BorderFactory.createEmptyBorder(20, 5, 10, 5));
searchPanel.setBorder(border);

解决了边框问题。

设置父组件的最小尺寸:

DateFormatDemo dateFormatDemo = new DateFormatDemo();
dateFormatDemo.setMinimumSize(new Dimension(200, 0));

【讨论】:

  • stackoverflow 上的聪明人告诉我永远不要使用 setMinimumSize 和 setMaximumSize 和 setPreferredSize,我开始对边框做同样的事情。谢谢老兄。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多