Java 为什么我必须使用getContentPane()而不是";这";为JFrame设置BoxLayout时?

Java 为什么我必须使用getContentPane()而不是";这";为JFrame设置BoxLayout时?,java,swing,user-interface,boxlayout,contentpane,Java,Swing,User Interface,Boxlayout,Contentpane,在将JFrame的布局设置为BoxLayout时,为什么必须使用getContentPane()而不是此关键字作为BoxLayout的参数参数。要为JPanel提供BoxLayout,我必须使用this作为参数 我认为这是因为JFrame有几个层或部分,它们是玻璃窗格、分层窗格、内容窗格和菜单栏。因此,this关键字指的是JFrame,但它不指的是我们想要配置布局管理器的内容窗格。这就是我们调用getContentPane()的原因。我读到JFrame的内容窗格实际上是一个JPanel clas

在将JFrame的布局设置为BoxLayout时,为什么必须使用getContentPane()而不是关键字作为BoxLayout的参数参数。要为JPanel提供BoxLayout,我必须使用this作为参数

我认为这是因为JFrame有几个层或部分,它们是玻璃窗格、分层窗格、内容窗格和菜单栏。因此,this关键字指的是JFrame,但它不指的是我们想要配置布局管理器的内容窗格。这就是我们调用getContentPane()的原因。我读到JFrame的内容窗格实际上是一个JPanel

class MyFrame1 extends JFrame {
    public MyFrame1() {    
        // This line does not work, why? 
        setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); 
    }
}

class MyFrame2 extends JFrame {
    public MyFrame2() {    
        // This line works
        setLayout(new BoxLayout(getContentPane(), BoxLayout.X_AXIS));
    }
}

class MyPanel extends JPanel {
    public MyPanel() {
        // JPanel uses "this" keyword
        setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
    }
}
总而言之:BoxLayout的目标参数接受JPanel,但不接受JFrame,但JFrame的内容窗格是JPanel

class MyFrame1 extends JFrame {
    public MyFrame1() {    
        // This line does not work, why? 
        setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); 
    }
}

class MyFrame2 extends JFrame {
    public MyFrame2() {    
        // This line works
        setLayout(new BoxLayout(getContentPane(), BoxLayout.X_AXIS));
    }
}

class MyPanel extends JPanel {
    public MyPanel() {
        // JPanel uses "this" keyword
        setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
    }
}
JPanel是否像JFrame一样有多个窗格?我必须使用getContentPane()的实际原因是什么


当编译器说BoxLayout不能共享时,这是否意味着BoxLayout不能在组成JFrame的多个窗格之间共享?

a
JFrame
是一个
容器
,但它不是
容器
,相反,
getContentPane()返回的
容器
是一个可以使用
BoxLayout
实例的组件。另一方面,考虑下面使用的变体:“一个轻量级容器,它使用<代码> BoxLayout < /Cord>对象作为其布局管理器。”

经测试:

import java.awt.EventQueue;
import javax.swing.Box;
import javax.swing.JFrame;
import javax.swing.JLabel;

/** @see http://stackoverflow.com/a/23159430/230513 */
public class Test {

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Box b = Box.createVerticalBox();
        b.add(new JLabel("Test"));
        f.setContentPane(b);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test().display();
            }
        });
    }
}

编译器真的这么说吗?是的,每次第一个参数(目标)使用错误参数时都会发生。我认为没有发生错误,因为我在MyFrame1中有正确的代码(这是一个意外,我已将其更改为包含错误的代码)。编译器真的说“BoxLayout无法共享”?“线程中的异常”main“java.awt.awt错误:无法共享BoxLayout”