Java 为什么我必须使用getContentPane()而不是";这";为JFrame设置BoxLayout时?
在将JFrame的布局设置为BoxLayout时,为什么必须使用getContentPane()而不是此关键字作为BoxLayout的参数参数。要为JPanel提供BoxLayout,我必须使用this作为参数 我认为这是因为JFrame有几个层或部分,它们是玻璃窗格、分层窗格、内容窗格和菜单栏。因此,this关键字指的是JFrame,但它不指的是我们想要配置布局管理器的内容窗格。这就是我们调用getContentPane()的原因。我读到JFrame的内容窗格实际上是一个JPanelJava 为什么我必须使用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
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”