JFrame #setLayout(LayoutManager)无法正常工作。强制执行getContentPane()。setLayout(LayoutManager)

时间:2015-12-04 09:40:30

标签: java swing jframe layout-manager contentpane

运行实例化此类的代码时:

static final class MyFrame extends JFrame {
    private CardLayout layout = new CardLayout();

    public MyFrame() {
        setLayout(layout);
        System.out.println(getLayout());
    }
}

打印的结果是:

java.awt.BorderLayout[hgap=0,vgap=0]

这是JFrame的默认布局。布局不会改变。但是,如果我改变

setLayout(layout);

getContentPane().setLayout(layout)

getLayout()将打印正确的布局。

MVCEs:

未设置布局:

public class Main {
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            MyFrame frame = new MyFrame();
            frame.setVisible(true);
        });
    }

    static final class MyFrame extends JFrame {
        private CardLayout layout = new CardLayout();

        public MyFrame() {
            setLayout(layout);
            System.out.println(getLayout());
        }
    }
}

设置布局:

public class Main {
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            MyFrame frame = new MyFrame();
            frame.setVisible(true);
        });
    }

    static final class MyFrame extends JFrame {
        private CardLayout layout = new CardLayout();

        public MyFrame() {
            getContentPane().setLayout(layout);
            System.out.println(getLayout());
        }
    }
}

1 个答案:

答案 0 :(得分:4)

我觉得你在某个地方遗失了什么。以下是使用

在我的电脑上的搜索结果
setLayout(layout);
System.out.println(getContentPane().getLayout()); // CardLayout is printed
System.out.println(getLayout()); // BorderLayout is printed

getContentPane().setLayout(layout);
System.out.println(getContentPane().getLayout()); // CardLayout is printed
System.out.println(getLayout()); // BorderLayout is printed

为什么不总是打印CardLayout?

JFrame#setLayout(LayoutManager)不同,JFrame#getLayout()不会调用contentPane()

事实上,JFrame#getLayout()实际上是从Container#getLayout()继承的,它会从实际组件中返回实际的LayoutManager(在这种情况下为JFrame而不是contentPane() {1}})。

JFrame#setLayout

  

设置LayoutManager。重写以有条件地转发呼叫   到contentPane。有关更多信息,请参阅RootPaneContainer。