JPanel内容窗格混乱

时间:2011-10-13 18:50:36

标签: java swing layout-manager jcomponent jmenubar

我正在学习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岁的老人问为什么天空是蓝色的,哈哈;)

4 个答案:

答案 0 :(得分:10)

一些随意的想法:

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

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

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

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

答案 3 :(得分:0)

您需要JComponent查看此API doc

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

同样在直接已知子类下,您可以看到扩展JComponent的所有类的列表,包括JMenuBarJPanel

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