如何在使用BorderLayout时控制JPanel setSize

时间:2013-05-24 14:39:10

标签: java swing

ComponentListener有一个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被调用?

3 个答案:

答案 0 :(得分:1)

  

是否正在调用setSize?

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

  

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

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

答案 1 :(得分:1)

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

如果您希望在组件大小发生变化时通知,请将ComponentListener添加到组件(而不是容器)。

答案 2 :(得分:0)

如果BorderLayout的约束是BorderLayout.CENTER,则无法调整其大小。 该组件自动获取所有可用空间。

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