Java 使用BorderLayout时如何控制JPanel设置大小

Java 使用BorderLayout时如何控制JPanel设置大小,java,swing,Java,Swing,我有一个主JFrame的ComponentListener,它在调整大小时发送一个事件,但在触发事件时,Jpanel已经调整大小 public class Test implements ComponentListener { private JFrame frame; private JPanel panel; public Test() { frame = new JFrame(); panel = new JPanel();

我有一个主
JFrame
ComponentListener
,它在调整大小时发送一个事件,但在触发事件时,
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) {}
}
如何在
JFrame
调整大小期间控制
JPanel setSize


编辑:我了解
BorderLayout
设置填充边框的组件。它如何设置组件的大小?它正在调用
setSize
?如果是,为什么被替代的setSize调用?

如果BorderLayout中的约束为BorderLayout.CENTER,则无法调整该组件的大小。 该组件将自动占用所有可用空间

更多信息:

是不是在叫setSize

布局管理器使用getPreferredSize()、getMinimumSize()和getMaximum()大小作为提示。打开布局管理器并使用或忽略这些提示。将构件添加到BorderLayout的中心时,将忽略所有提示,并根据可用空间调整构件的大小。因此,是的,布局管理器将调用组件的setSize()和setLocation方法。不应直接调用setSize()方法

为什么不调用我的重写setSize


您没有
重写
setSize()方法。执行代码时,
调用了
setSize()方法。然后,当框架打包时,将调用布局管理器(),布局管理器将调用面板上的setSize()方法。

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


如果您希望在组件大小更改时收到通知,请向组件(而不是容器)添加一个ComponentListener。

我将ComponentListener从JFrame更改为JPanel,这证明更符合我的预期。@Aboutblank关于为什么不调用覆盖的setSize()的问题,LayoutManager更可能调用setBounds()-方法,因为它不仅控制大小,还控制位置。但是没有说明LayoutManager必须使用哪种方法,因此它可以使用它认为最适合其工作的任何组件方法。感谢您提供的信息,这正是我想要了解的。