繁体   English   中英

JPanel内容窗格混乱

[英]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岁的老人问为什么天空是蓝色的,哈哈;)

一些随意的想法:

  • 是的,JPanels和其他组件通常是“嵌套”的。 这是对Swing / AWT布局管理者的深刻理解至关重要的地方。
  • 虽然JFrame的getContentPane()返回的类型在技术上是一个Container,但它也是一个JPanel(最终从Container继承)。
  • 我相信你可以制作任何派生自ContainerPane的东西,但是你需要注意它是不透明的。

因为有方法

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小部件,例如JButtonJLabel等。但是,它们将自动添加到关联的contentPane中。

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

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

您需要为JComponent查看此API文档

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

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

因此, JMenuBarJPanelJComponent (或Container )的两个更专业的版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM