我找到了三种方法来填充我的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(...)来填充我的框架。
答案 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经理集 在它上面。