14

我找到了三种填充 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(...) 来填充我的框架。

4

4 回答 4

9

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

于 2011-06-26T21:31:55.667 回答
2

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

于 2011-08-17T20:57:39.193 回答
2

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

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

于 2011-06-26T21:53:01.997 回答
0

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

其中说:

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

   frame.add(child);   

但是,使用 JFrame 您需要将子项添加到 JFrame 的内容窗格中:

   frame.getContentPane().add(child);  

设置布局管理器、删除组件、列出子项等也是如此。所有这些方法通常都应该发送到内容窗格而不是 JFrame 本身。内容窗格将始终为非空。尝试将其设置为 null 将导致 JFrame 抛出异常。默认内容窗格将设置一个 BorderLayout 管理器。

于 2011-06-26T22:03:22.970 回答