ContentPane和JPanel之间有什么关系?

2022-09-01 05:21:14

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

我尝试了两件事:

  1. 我摆脱了容器。更详细地说,我向面板添加了按钮(的实例),然后将面板添加到窗口(的实例)。它工作正常。JPanelJFrame

  2. 我摆脱了面板。更详细地说,我将按钮直接添加到容器中,然后将容器添加到窗口(的实例)。JFrame

所以,我不明白两件事。

  1. 为什么我们有两个相互竞争的机制来做同样的事情?

  2. 将容器与面板()结合使用的原因是什么?(例如,我们在JPanels中包含按钮,然后在容器中包含JPanels)。我们可以包括在吗?我们可以在容器中包含容器吗?JPanelJPanelJPanel

添加:

也许我的问题的本质可以放在一行代码中:

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);
    }
}

在此示例中,我只使用内容窗格:

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);
    }
}

两者都工作正常!我只是想知道在这两种做事方式之间,一种是否更好(更安全)。


答案 1

它不是两个相互竞争的机制 - a是一个(只要看看JPanel javadocs顶部的类层次结构)。 只是返回 a 以将要显示的 s 放在 .在内部,它使用a(默认情况下 - 您可以通过调用来更改它)至于为什么它返回a而不是a - 这是因为您应该编程到接口,而不是实现 - 在该级别上,您需要关心的是您可以将s添加到某些东西中 - 即使它是一个类而不是一个接口 - 它提供了完全执行此操作所需的接口。JPanelContainerJFrame.getContentPane()ContainerComponentJFrameJPanelsetContentPane()ContainerJPanelComponentContainer

至于为什么两者都做同样的事情 - 被覆盖调用.情况并非总是如此 - 在JDK 1.5之前,你总是必须明确指定并抛出一个如果你调用它,但由于许多抱怨,这在JDK 1.5中被更改,以做你期望的事情。JFrame.add()JFrame.getContentPane().add()JFrame.add()JFrame.getContentPane().add()JFrame.getContentPane().add()JFrame.add()RuntimeException


答案 2

问得好。我发现理解“Swing 提供了三个通常有用的顶级容器类:、 、 和 ....为方便起见,add 方法及其变体,remove 和 setLayout 已被覆盖,以便根据需要转发到 contentPane。- 使用顶级容器JFrameJDialogJApplet


推荐