JAVA:填充框架的方法。添加(),设置内容窗格(),获取内容窗格()

发布于 2024-11-17 04:06:28 字数 735 浏览 6 评论 0原文

我找到了三种方法来填充我的 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());

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

I found three ways to fill my JFrame frame = new JFrame("...")
createContentPanel returns a JPanel and createToolBar returns a 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());

And now I am wondering why should i use the getContentPane()/setContentPane() method if i could just use a simple frame.add(...) to fill my frame.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

皓月长歌 2024-11-24 04:06:28

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

You are right that it doesn't matter which you use (JFrame#add(...) vs. JFrame#getContentPane().add(...)) since they both essentially call the same code, however there will be times in the future when you'll need access to the contentPane itself, such as if you want to change its border, set its background color or determine its dimensions, and so you'll likely use getContentPane() at some point, and thus getting to know it and be familiar with it would be helpful.

兰花执着 2024-11-24 04:06:28

//这仅将最后一个放入 JFrame

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

//this only puts the last one into the JFrame

You need to understand how layout managers work. The default content pane is a JPanel that uses a BorderLayout. When you add a component and don't specify a constraint, then it defaults to the CENTER. However you can only has a single component in the center so the layout manager only knows about the last one added. When the layout manager is invoked it sets the size() and location() of that component. The other component has a size of 0, so it is never painted.

李不 2024-11-24 04:06:28

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

In Java 1.6, you can just use the add method of JFrame:
http://download.oracle.com/javase/6/docs/api/javax/swing/JFrame.html
(It will be delegated to the contentPane.)

寻找我们的幸福 2024-11-24 04:06:28

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

其中说:

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

frame.add(child);   

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

frame.getContentPane().add(child);  

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

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

Which says:

The JFrame class is slightly
incompatible with Frame. Like all
other JFC/Swing top-level containers,
a JFrame contains a JRootPane as its
only child. The content pane provided
by the root pane should, as a rule,
contain all the non-menu components
displayed by the JFrame. This is
different from the AWT Frame case. For
example, to add a child to an AWT
frame you'd write:

   frame.add(child);   

However using JFrame you need to add the child
to the JFrame's content pane instead:

   frame.getContentPane().add(child);  

The same is true for setting layout
managers, removing components, listing
children, and so on. All these methods
should normally be sent to the content
pane instead of the JFrame itself. The
content pane will always be non-null.
Attempting to set it to null will
cause the JFrame to throw an
exception. The default content pane
will have a BorderLayout manager set
on it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文