之间的区别是:使用来自JFrame Class&的getContentPane()。来自JRootPane的getContentPane()?

时间:2017-07-11 20:14:53

标签: java swing

我做了一些研究,以了解 JFrame 及其部分的使用情况,我发现了这个信息:

1-部分JFrame

  • Root Pane
  • 菜单Bare
  • 内容窗格
  • Glass Pane

2- JFrame实现Interface 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?

2 个答案:

答案 0 :(得分:2)

没有区别。拨打frame.getContentPane()frame.getRootPane().getContentPane()更方便。

Swing这样做有两个原因。

1)JFrame需要将RootPaneContainer作为标记来实现JavaDoc中指定的原因。

2)它具有单独的JRootPane,因此可以在实现类JDialorJInternalFrame的其他RootPaneContainer中重用它。它就像Delegation模式。

答案 1 :(得分:0)

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

界面RootPaneContainer

由具有单个JRootPane子代的组件实现:JDialog,JFrame,JWindow,JApplet,JInternalFrame。 此界面中的方法仅涵盖JRootPane属性

<强> e.g。 getContentPane()通常如下所示:

vim

getRootPane(); 返回一个JRootPane对象

getContentPanel(); 返回容器对象