1

我试图防止 JPanle 变得如此之小以至于它会切断它的子组件,是否有强制执行此操作?读完这篇文章后,我尝试了(在 jython 中):

frame= JFrame('example', size=(200,200))

pan = JPanel()
pan.add(JLabel('beer'))
pan.add(JButton('get one', actionPerformed=printer))
pan.setMinimumSize(panel.getPreferredSize())

frame.add(pan)
frame.visible = True

但是,即使我将最小尺寸应用于框架,面板仍然可以缩小到它切断其组件(在 JFrame 或此处)。如何防止这种情况发生?(我假设我得到的首选大小不是我想要的,因为使用默认布局管理器它似乎是最大子组件的大小,但如果我将它更改为例如GridBagLayout它似乎变得更小 9apply minsize to frame 并尝试)

4

1 回答 1

3

您可以在您的 JFrame 上使用它(对不起,它是 Java,我不熟悉 Jython):

frame.setMinimumSize(frame.getPreferredSize());

如果强制执行最小尺寸LayoutManager的内容窗格,您的代码可以工作。JFrame但是,默认情况下你会得到一个BorderLayoutwhich 没有。如果您使用frame.setMinimumSize(pan.getPreferredSize());,它将不起作用,因为框架的大小包括其插图(即框架边框的大小),因此您设置的最小尺寸实际上太小了。

这是一个小演示,展示了如何使最小尺寸在 JFrame 上工作:

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class TestMinimumSizeOnFrame {

    protected void initUI() {
        JFrame frame = new JFrame("example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200, 200);

        JPanel pan = new JPanel();
        pan.add(new JLabel("Some nice beer"));
        pan.add(new JButton("get one"));
        frame.add(pan);
        frame.setVisible(true);
        frame.setMinimumSize(frame.getPreferredSize());

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestMinimumSizeOnFrame().initUI();
            }
        });
    }

}
于 2012-07-10T13:17:44.500 回答