防止JPanel切断子组件

时间:2012-07-10 10:13:01

标签: swing jpanel jython

我试图阻止JPanle变得如此之小以至于切断它的子组件,无论如何要强制执行此操作?在阅读this之后,我尝试了(在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或here中)。如何防止这种情况? (我假设我得到的首选大小不是我想要的,因为使用默认布局管理器它似乎是最大子组件的大小,但如果我将其更改为例如GridBagLayout它似乎变得更小9apply minsize框架和尝试)

1 个答案:

答案 0 :(得分:3)

你可以在你的JFrame上使用它(抱歉它是Java,我不熟悉Jython):

frame.setMinimumSize(frame.getPreferredSize());

如果LayoutManager的内容窗格的JFrame强制执行最小尺寸,则您的代码可以正常工作。但是,默认情况下,您会收到BorderLayout但不会。如果您使用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();
            }
        });
    }

}