2

我有一个ComponentListenerfor main JFrame,它在调整大小时发送一个事件,但是在触发事件时,Jpanel已经调整了大小。

public class Test implements ComponentListener {
    private JFrame frame;
    private JPanel panel;

    public Test() {
        frame = new JFrame();
        panel = new JPanel();

        frame.setPreferredSize(new Dimension(300, 300));
        frame.getContentPane().add(panel, BorderLayout.CENTER);
        frame.addComponentListener(this);

        frame.pack();
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    Test test = new Test();
                    test.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    @Override
    public void componentResized(ComponentEvent e) {
        System.out.println(frame.getSize() + " : " + panel.getSize());
        frame.revalidate();
    }

    @Override
    public void componentHidden(ComponentEvent e) {}

    @Override
    public void componentMoved(ComponentEvent e) {}

    @Override
    public void componentShown(ComponentEvent e) {}
}

JPanel setSize在调整大小期间如何控制JFrame

编辑:我了解BorderLayout设置组件来填充边框。它如何设置组件的大小?是在召唤setSize吗?如果是,为什么调用一个覆盖的 setSize?

4

3 回答 3

1

它在调用 setSize 吗?

布局管理器使用 getPreferredSize()、getMinimumSize() 和 getMaximum() 大小作为提示。布局管理器并使用或忽略这些提示。当您将组件添加到 BorderLayout 的 CENTER 时,所有提示都会被忽略,并且组件的大小会调整为可用空间。所以,是的,布局管理器将调用组件的 setSize()(和 setLocation)方法。您不应直接调用 setSize() 方法

为什么我的覆盖 setSize 没有被调用?

你没有overridesetSize() 方法。当您执行代码时,您invoked使用 setSize() 方法。然后,当 frame 被打包()时,布局管理器被调用,并且布局管理器将调用面板上的 setSize()方法。

于 2013-05-24T15:20:21.133 回答
1

当组件添加到 LayoutManager 控制下的容器时,您无法直接控制组件大小。这违背了使用布局管理器的目的。

如果您想在组件大小发生更改时收到通知,请将 ComponentListener 添加到组件(而不是容器)。

于 2013-05-24T15:22:03.627 回答
0

如果它的约束是 BorderLayout.CENTER,则不能在 BorderLayout 中调整组件的大小。该组件自动占用所有可用空间。

更多信息:http ://docs.oracle.com/javase/tutorial/uiswing/layout/border.html

于 2013-05-24T14:56:56.813 回答