我发现一个例子,其中按钮被添加到面板(JPanel
实例),然后将面板添加到容器(由getContentPane()
生成的实例),然后通过构造方法将容器包含在JFrame
(窗口)中。
我尝试了两种方式:
我摆脱了容器。更具体地说,我先将按钮添加到面板(
JPanel
实例),然后再将面板添加到窗口(JFrame
实例)。它运行得很好。我摆脱了面板。更具体地说,我直接将按钮添加到容器,然后将容器添加到窗口(
JFrame
实例)。
因此,我不理解以下两点:
为什么我们有两种竞争机制来完成相同的事情?
使用容器与面板(
JPanel
)组合的原因是什么? (例如,我们将按钮包含在JPanel
中,然后将JPanel
包含在容器中)。我们可以在JPanel
中包含JPanel
吗?我们可以在容器中包含容器吗?
添加:
也许我的问题的本质可以放在一行代码中:
frame.getContentPane().add(panel);
我们为什么要在中间放置getContentPane()
?我尝试只使用frame.add(panel);
也可以正常工作。
添加2:
我想添加一些代码,以更清楚地说明我的意思。在这个例子中,我只使用了JPane:
import java.awt.*;
import javax.swing.*;
public class HelloWorldSwing {
public static void main(String[] args) {
JFrame frame = new JFrame("HelloWorldSwing");
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(new JButton("W"), BorderLayout.NORTH);
panel.add(new JButton("E"), BorderLayout.SOUTH);
frame.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
在这个例子中,我仅使用内容窗格(Content Pane):
import java.awt.*;
import javax.swing.*;
public class HelloWorldSwing {
public static void main(String[] args) {
JFrame frame = new JFrame("HelloWorldSwing");
Container pane = frame.getContentPane();
pane.setLayout(new BorderLayout());
pane.add(new JButton("W"), BorderLayout.NORTH);
pane.add(new JButton("E"), BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
两种方法都可以正常工作! 我只想知道在这两种方法中,哪一种更好(更安全)。
JFrame
内部使用JPanel
对象来支持getContentPane()
方法。这就是为什么 Zachary 的答案有效的原因。实际的JPanel
引用被嵌入在JFrame.rootPane
字段中。你可以在JFrame
上调用setContentPane()
- 例如,你可以将第一个示例中的第10行从frame.add(panel)
更改为frame.setContentPane(panel)
。Container
是一个类。JPanel
是一个类(它是Container
的子类)。你混淆了引用类型和引用所指向的对象类型。想一想Container container = new JPanel()
。 - Nate