5

我正在学习 Java Swing,并在框架上附加了一个 menuBar。默认情况下,这应该调用jframe.getContentPane().add(child). 当我运行脚本时,menuBar 没有出现。但是如果有意义的话,按钮位于最顶部的“y = 0”。

然后我意识到我的错误我实际上必须在菜单栏中放入一个菜单。然后菜单栏出现了。所以这让我想到......“菜单栏”“内容窗格”实际上是 2 个面板吗?这让我很困惑。因为这很像一个面板。但是getContentPane()返回一个容器,而不是一个 JPanel 对象,所以我很困惑。

如果是这样,这是否意味着唯一直接转储到框架中的只是 Jpanel 对象?因此 JButtons、JLabels 并不直接在一个框架中......这是否意味着 jpanels 是“嵌套的”?还有一件事让我感到困惑。如果 jpanel 可以控制事物的定位方式,那么 LayoutManager 有什么用?:S 谢谢,请像 2 岁的孩子一样回答,问为什么天空是蓝色的,哈 ;)

4

4 回答 4

10

一些随意的想法:

  • 是的,JPanels 和其他组件通常是“嵌套的”。这就是对 Swing/AWT 布局管理器的深刻理解至关重要的地方。
  • 虽然 JFrame 返回的类型在getContentPane()技术上是一个 Container,但它也是一个 JPanel(最终继承自 Container)。
  • 我相信您可以将任何从 Container 派生的内容制作成 contentPane,但您需要注意它是不透明的。
于 2011-10-13T18:56:39.563 回答
3

为此有方法

frame.setJMenuBar(menuBar);

对于今天的 Java Swing GUI,不需要声明ContentPane,来自 Java5,并且默认使用BorderLayoutLayoutManager

然后frame.add(myPanel); //frame.add(myPanel, BorderLayout.CENTER)与占用整个Container相同

关于如何使用LayourManagers的基本知识

于 2011-10-13T18:57:23.967 回答
1

getContentPane()总是返回一个Container实例。但是,您应该注意JPanel对象是Container实例,以及 Swing 框架中的其他类。返回的实例的实际类无关紧要,因为您无法控制将哪个实现Container用作 contentPane(除非您强制使用特定的 contentPane),并且大多数情况下这应该不是问题。

您可以在 中添加许多 GUI 小部件JFrame,例如JButtonJLabel等。但是,它们将自动添加到关联的 contentPane 中。

JPanel不处理对象定位,LayoutManager与您的面板相关联;要么自动基于它自己的规则集(例如FlowLayout),要么使用您在将对象添加到容器时指定的约束(GridBagLayout布局管理器是一个很好的例子)。LayoutManager 上的 JavaDoc 通常包含足够的信息来帮助您开始使用它们。

你可以有嵌套面板,是的。AContainer可以包含其他Container实例。虽然这似乎是一个复杂的解决方案,但它确实使您能够准确控制 GUI 的显示方式。根据LayoutManager您使用的内容、您必须通过用户界面满足的需求以及您作为开发人员的偏好/习惯,您可能需要更少或更多的嵌套面板。

于 2011-10-13T19:09:46.497 回答
0

您需要查看此API 文档以获取JComponent.

如果您查看继承层次结构,您将看到JComponent扩展Component,因此 JComponent 是一个组件。

同样在Direct Known Subclasses下,您可以看到扩展JComponent包括JMenuBar和的所有类的列表JPanel

所以JMenuBarJPanelJComponent(or Container) 的两个更专业的版本。

于 2011-10-13T19:13:08.447 回答