ContentPane和JPanel之间的关系是什么?

22 浏览
0 Comments

ContentPane和JPanel之间的关系是什么?

我找到了一个例子,其中按钮被添加到面板(JPanel的实例),然后面板被添加到容器(由getContentPane()生成的实例),然后容器被构建包含在JFrame(窗口)中。

我尝试了两种方法:

  1. 我摆脱了容器。更详细地说,我将按钮添加到面板(JPanel的实例),然后将面板添加到窗口(JFrame的实例)。它工作得很好。
  2. 我不再使用面板。更详细地说,我直接将按钮添加到容器,然后将容器添加到窗口(JFrame的实例)。

所以,我不明白两件事:

  1. 为什么我们有两种竞争的机制来完成相同的事情?
  2. 为什么要将容器与面板(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);
    }
}

两者都能正常工作!我只是想知道在这两种方法中,哪一种更好(更安全)。

0