JAVA:填充框架的方法。 add(),setContentPane(),getContentPane()

时间:2011-06-26 21:27:50

标签: java jframe jtoolbar

我找到了三种方法来填充我的JFrame帧=新的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 个答案:

答案 0 :(得分:8)

你是对的,你使用哪个(JFrame#add(...)JFrame#getContentPane().add(...))并不重要,因为他们基本上都会使用相同的代码,但是将来有时候你会这样做需要访问contentPane本身,例如,如果你想改变它的边框,设置它的背景颜色或确定它的尺寸,所以你可能会在某个时候使用getContentPane(),从而了解它并熟悉它这会很有帮助。

答案 1 :(得分:2)

  

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

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

答案 2 :(得分:2)

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

答案 3 :(得分: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。   试图将其设置为null将   导致JFrame抛出一个   例外。默认内容窗格   将有一个BorderLayout经理集   在它上面。