我正在学习Java Swing,我在框架中添加了一个菜单栏。默认情况下,它应该调用jframe.getContentPane().add(child)
。当我运行脚本时,菜单栏没有显示。但是按钮是在最上面的"y=0",如果有意义的话。
然后我意识到我的错误,我实际上必须在菜单栏中放入一个菜单。然后菜单栏出现了。这让我开始思考……"菜单栏"内容窗格"实际上是2个面板吗?这让我很困惑。因为那很像一个面板。但是getContentPane()
返回一个容器,而不是一个JPanel对象,所以我很困惑。
如果是这样,这是否意味着唯一直接转储到框架中的只是Jpanel对象?因此,JButtons, jlabel并不直接在框架中…这是否意味着jpanel是"嵌套的"?还有一件事让我很困惑。如果jpanel可以控制事物的位置,那么LayoutManager是用来做什么的?:年代谢谢,请像一个2岁的孩子问为什么天空是蓝色的一样回答,哈;)
随想:
- 是的,jpanel和其他组件经常是"嵌套的"。这就是对Swing/AWT布局管理器的牢固理解是必要的。虽然JFrame的
- 我相信你可以使任何从容器派生的contentPane,但你需要注意它是不透明的。
getContentPane()
返回的类型在技术上是一个Container,但它也是一个JPanel(最终继承自Container)。有一个方法
frame.setJMenuBar(menuBar);
对于今天的Java Swing GUI,没有必要声明ContentPane
,从Java5,并与BorderLayout作为默认的LayoutManager
然后frame.add(myPanel);
//与frame.add(myPanel, BorderLayout.CENTER)
和已占用的整个容器相同
getContentPane()
总是返回一个Container
实例。但是,您应该注意到JPanel
对象是Container
实例,以及Swing框架中的其他类。返回实例的实际类是无关紧要的,因为您无法控制使用Container
的哪个实现作为contentPane(除非您强制使用特定的contentPane),并且大多数情况下这应该不是问题。
您可以在JFrame
中添加许多GUI小部件,例如JButton
, JLabel
等。但是,它们会自动添加到相关的contentPane。
JPanel
不处理对象定位,LayoutManager
与你的面板相关联;自动地基于它自己的一组规则(例如FlowLayout
),或者通过使用你在将对象添加到容器时指定的约束(GridBagLayout
布局管理器是一个很好的例子)。layoutmanager上的JavaDoc通常包含足够的信息,可以让您开始使用它们。
你可以有嵌套面板,是的。Container
可以包含其他Container
实例。虽然这似乎是一个复杂的解决方案,但它确实使您能够准确地控制GUI的显示方式。根据您使用的LayoutManager
,根据您必须通过用户界面满足的需求,以及作为开发人员的您自己的偏好/习惯,您可能需要更少或更多的嵌套面板。
您需要查看JComponent
的API文档。
如果你看一下继承层次结构,你会看到JComponent
扩展了Component
,所以JComponent是一个组件。
同样在直接已知子类下,您可以看到扩展JComponent
的所有类的列表,包括JMenuBar
和JPanel
。
因此,JMenuBar
和JPanel
是JComponent
(或Container
)的两个更特殊的版本。