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