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