3

我有一个简单的 GUI GridBagLayout,顶部有一个按钮面板,一个可调整大小的自定义组件占据了其余空间,如下图所示:

启动时的 GUI。

自定义组件(红色)的首选尺寸为 (400, 300),最小尺寸为 (40, 30),并且很乐意将其调整为大于该尺寸的任何尺寸。但是,我希望我的框架尊重按钮面板的最小尺寸,并且不允许调整框架的大小以使任何按钮都没有完全显示在屏幕上。这不是当前的行为,因为我可以将其调整到远远超出这些边界,如下所示:

GUI 调整得小得离谱。

我目前的代码如下:

import javax.swing.*;
import java.awt.*;

public class Example {
    public static void main(String[] args) {
        // Setup JFrame and GridBagLayout.
        JFrame frame = new JFrame("Example");
        Container contentPane = frame.getContentPane();
        GridBagLayout layout = new GridBagLayout();
        contentPane.setLayout(layout);
        layout.rowWeights = new double[] {0.0, 1.0};
        layout.columnWeights = new double[] {1.0};
        GridBagConstraints cons = new GridBagConstraints();

        // Add button panel with a BoxLayout.
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
        panel.add(new JButton("Button 1"));
        panel.add(new JButton("Button 2"));
        panel.add(new JButton("Button 3"));
        cons.anchor = GridBagConstraints.NORTHWEST;
        cons.gridx = 0;
        cons.gridy = 0;
        layout.setConstraints(panel, cons);
        contentPane.add(panel);

        // Add custom component, resizable.
        JComponent custom = new JComponent() {
            public Dimension getPreferredSize() {
                return new Dimension(400, 300);
            }

            public Dimension getMinimumSize() {
                return new Dimension(40, 30);
            }

            public void paintComponent(Graphics g) {
                g.setColor(Color.RED);
                g.fillRect(0, 0, getWidth(), getHeight());
            }
        };
        cons.gridx = 0;
        cons.gridy = 1;
        cons.fill = GridBagConstraints.BOTH;
        layout.setConstraints(custom, cons);
        contentPane.add(custom);

        // Pack and show frame.
        frame.pack();
        frame.setVisible(true);
    }
}

我已经在 Mac OS X 10.8 (Java 6) 和 Ubuntu 3.2.8 (Java 6) 上对此进行了测试,并观察到了同样的情况。

如何防止框架被调整大小以覆盖任何按钮?更一般地说,我怎样才能GridBagLayout真正尊重我的组件的最小尺寸?当我打印出我的框架的最小尺寸时(291, 81),这正是我想要的,但是当我调整框架的大小时,它就超出了。

注意:我已经查看了这个相关问题,但它似乎没有回答我的问题。

4

3 回答 3

4

我不知道为什么,但如果我使用...

frame.setMinimumSize(frame.getMinimumSize());

在创建 UI 之后(显然),它就可以工作了。

我“认为”它与...((WindowPeer)peer).updateMinimumSize();setMinimumSize大小方法有关Window

于 2013-10-22T02:10:11.903 回答
2

如果在您的框架上设置了最小尺寸,那么您可以将 a 添加ComponentListener到框架并实现该componentResized方法。

像这个例子

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
public class Test {
    public static void main(String[] args) 
    {
        final JFrame frame = new JFrame("My Frame");
        frame.setMinimumSize(new Dimension(200,200));
        frame.addComponentListener( new ComponentAdapter()
        {
            public void componentResized(ComponentEvent evt)
            {
                Dimension size = frame.getSize();
                Dimension min = frame.getMinimumSize();
                if (size.getWidth() < min.getWidth())
                {
                    frame.setSize((int)min.getWidth() ,(int) size.getHeight());
                }
                if (size.getHeight() < min.getHeight())
                {
                    frame.setSize((int)size.getWidth() ,(int) min.getHeight());
                }
            }
        });
        frame.setSize(300,300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
于 2013-10-22T02:00:26.300 回答
-1

我经常在使用 GridBagConstraints 默认值时遇到这种问题:我很久以前就养成了明确设置它们(weightx、gridwidth 等)的习惯。这通常会让 GridBagLayout 尊重我的最小尺寸。如果有人知道我要覆盖哪个默认值来实现这一点,我很好奇:-)

于 2013-10-22T01:51:52.507 回答