Java 两者之间的区别是:使用JFrame类中的getContentPane();从JRootPane获取ContentPane()?

Java 两者之间的区别是:使用JFrame类中的getContentPane();从JRootPane获取ContentPane()?,java,swing,Java,Swing,我已经做了一些研究来了解JFrame及其部分的用法,我发现以下信息: 1-JFrame的部分 根窗格 菜单空白 内容窗格 玻璃窗 2-JFrame实现接口RootPaneContainer return type | method name Container getContentPane(); Container getGlassPane(); JLayeredPane getLayeredPane(); JRootPane getRo

我已经做了一些研究来了解JFrame及其部分的用法,我发现以下信息:

1-JFrame的部分

  • 根窗格
  • 菜单空白
  • 内容窗格
  • 玻璃窗
2-JFrame实现接口RootPaneContainer

return type  |  method name

Container       getContentPane();

Container       getGlassPane();

JLayeredPane    getLayeredPane();

JRootPane       getRootPane();
3-JRootPane JFrame的JRootPane。JRootPane是JFrame在幕后使用的轻量级容器

JFrame实现RootPaneContainer接口,它们都将自己的操作委托给JRootPane

注意:JComponent方法getRootPane可用于获取包含给定组件的JRootPane

代码:

public static void main(String[] args) {

        //--> create JFrame
        JFrame f = new JFrame("Demo Frame");
        f.setSize(300, 150);
        f.setVisible(true);

        //--> now use JFrame.getContentPane()

        Container c = f.getContentPane();

        //--> use JOptionpane.getContentPane()

        JRootPane op = f.getRootPane();
        op.getContentPane();         
    }

问题:为什么我应该使用JRootPane中的getContentPane()方法而不是JFrame?

没有区别。调用
frame.getContentPane()
比调用
frame.getRootPane().getContentPane()
更方便

Swing这样做有两个原因

1) 由于中指定的原因,
JFrame
需要将
RootPaneContainer
实现为标记


2) 它有单独的
JRootPane
,因此可以在其他RootPaneContainer实现类中重用,如
JDialor
JInternalFrame
。这就像是一种模式。

我在帮助别人时找到了一个答案:

接口RootPaneContainer

由具有单个JRootPane子级的组件实现:JDialog、JFrame、JWindow、JApplet、JInternalFrame此接口中的方法仅涵盖JRootPane属性

例如getContentPane()通常是这样实现的:

 public Container getContentPane() {
     return getRootPane().getContentPane();
 }
getRootPane()返回JRootPane对象

getContentPanel()返回容器对象