ContentPane和JPanel之间的关系是什么?
ContentPane和JPanel之间的关系是什么?
我找到了一个例子,其中按钮被添加到面板(JPanel
的实例),然后面板被添加到容器(由getContentPane()
生成的实例),然后容器被构建包含在JFrame
(窗口)中。
我尝试了两种方法:
- 我摆脱了容器。更详细地说,我将按钮添加到面板(
JPanel
的实例),然后将面板添加到窗口(JFrame
的实例)。它工作得很好。 - 我不再使用面板。更详细地说,我直接将按钮添加到容器,然后将容器添加到窗口(
JFrame
的实例)。
所以,我不明白两件事:
- 为什么我们有两种竞争的机制来完成相同的事情?
- 为什么要将容器与面板(
JPanel
)结合使用?(例如,我们为什么要将按钮放入JPanels中,然后将JPanels包含在容器中)。我们可以将JPanel
包含在JPanel
中吗?我们可以将容器包含在容器中吗?
补充:
也许我的问题的本质可以用一行代码来表达:
frame.getContentPane().add(panel);
为什么我们要在中间加入getContentPane()
?我尝试只使用frame.add(panel);
,它也能正常工作。
补充2:
我想添加一些代码,以便更清楚地表达我的意思。在这个例子中,我只使用了JPanel:
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); } }
在这个例子中,我只使用了内容面板:
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); } }
两者都能正常工作!我只是想知道在这两种方法中,哪一种更好(更安全)。