【问题标题】:JAVA: Ways to fill a Frame. add(), setContentPane(), getContentPane()JAVA:填充框架的方法。添加(),setContentPane(),getContentPane()
【发布时间】:2011-09-23 03:09:39
【问题描述】:

我找到了三种方法来填充我的 JFrame frame = new JFrame("...") createContentPanel 返回一个 JPanel,createToolBar 返回一个 ToolBar。

frame.add(this.createToolBar(), BorderLayout.PAGE_START); //this works and puts the ToolBar above and the ContentPanel under it<br>
frame.add(this.createContentPanel(), BorderLayout.CENTER);

frame.setContentPane(this.createContentPanel()); //this lets the JToolBar hover over the ContentPanel
frame.getContentPane().add(this.createToolBar()); 

frame.getContentPane().add(this.createContentPanel()); //this only puts the last one into the JFrame
frame.getContentPane().add(this.createToolBar());

现在我想知道为什么我应该使用 getContentPane()/setContentPane() 方法,如果我可以使用一个简单的 frame.add(...) 来填充我的框架。

【问题讨论】:

    标签: java jframe jtoolbar


    【解决方案1】:

    您是对的,您使用哪个(JFrame#add(...)JFrame#getContentPane().add(...))并不重要,因为它们本质上都调用相同的代码,但是将来有时您需要访问contentPane 本身,例如如果您想更改其边框、设置其背景颜色或确定其尺寸,因此您可能会在某些时候使用 getContentPane(),因此了解并熟悉它会有所帮助.

    【讨论】:

    • 感谢您的回复。但这三种变体之间存在差异。我可以猜测第二个和第三个之间的问题是,我首先要设置一个 ContentPane,然后才能添加一些严重的东西。但是当我比较第一个和第三个时,这是一个巨大的差异。
    • @froehli:当然,两者之间的区别在于您首先要考虑 contentPane 的布局,这是应该始终做的事情!请注意,contentPane 默认使用 BorderLayout,但如果您通过 setContentPane 设置 contentPane,则您有责任将 contentPane 的布局设置为最适合您的布局。
    【解决方案2】:

    //这只会把最后一个放入JFrame

    您需要了解布局管理器的工作原理。默认内容窗格是使用 BorderLayout 的 JPanel。当您添加组件但未指定约束时,它默认为 CENTER。但是,您只能在中心拥有一个组件,因此布局管理器只知道添加的最后一个组件。当调用布局管理器时,它会设置该组件的 size() 和 location()。另一个组件的大小为 0,因此它永远不会被绘制。

    【讨论】:

      【解决方案3】:

      在 Java 1.6 中,您可以只使用 JFrame 的 add 方法: http://download.oracle.com/javase/6/docs/api/javax/swing/JFrame.html (它将被委托给 contentPane。)

      【讨论】:

        【解决方案4】:

        http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/JFrame.html

        上面写着:

        JFrame 类略 与框架不兼容。像所有人一样 其他 JFC/Swing 顶级容器, 一个 JFrame 包含一个 JRootPane 作为它的 唯一的孩子。提供的内容窗格 通常,根窗格应 包含所有非菜单组件 由 JFrame 显示。这是 不同于 AWT Frame 的情况。为了 例如,将孩子添加到 AWT 你要写的框架:

           frame.add(child);   
        

        但是使用 JFrame 你需要添加孩子 改为 JFrame 的内容窗格:

           frame.getContentPane().add(child);  
        

        设置布局也是如此 经理,删除组件,列出 儿童等等。所有这些方法 通常应该发送到内容 窗格而不是 JFrame 本身。这 内容窗格将始终为非空。 尝试将其设置为 null 将 导致 JFrame 抛出一个 例外。默认内容窗格 将设置一个 BorderLayout 管理器 就可以了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-04-29
          • 2018-06-25
          • 1970-01-01
          • 2014-08-28
          • 1970-01-01
          • 2013-05-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多