JPanel内容窗格混淆



我正在学习Java Swing,我在框架中添加了一个菜单栏。默认情况下,它应该调用jframe.getContentPane().add(child)。当我运行脚本时,菜单栏没有显示。但是按钮是在最上面的"y=0",如果有意义的话。

然后我意识到我的错误,我实际上必须在菜单栏中放入一个菜单。然后菜单栏出现了。这让我开始思考……"菜单栏"内容窗格"实际上是2个面板吗?这让我很困惑。因为那很像一个面板。但是getContentPane()返回一个容器,而不是一个JPanel对象,所以我很困惑。

如果是这样,这是否意味着唯一直接转储到框架中的只是Jpanel对象?因此,JButtons, jlabel并不直接在框架中…这是否意味着jpanel是"嵌套的"?还有一件事让我很困惑。如果jpanel可以控制事物的位置,那么LayoutManager是用来做什么的?:年代谢谢,请像一个2岁的孩子问为什么天空是蓝色的一样回答,哈;)

随想:

    是的,jpanel和其他组件经常是"嵌套的"。这就是对Swing/AWT布局管理器的牢固理解是必要的。虽然JFrame的getContentPane()返回的类型在技术上是一个Container,但它也是一个JPanel(最终继承自Container)。
  • 我相信你可以使任何从容器派生的contentPane,但你需要注意它是不透明的。

有一个方法

frame.setJMenuBar(menuBar);

对于今天的Java Swing GUI,没有必要声明ContentPane,从Java5,并与BorderLayout作为默认的LayoutManager

然后frame.add(myPanel);//与frame.add(myPanel, BorderLayout.CENTER)和已占用的整个容器相同

关于如何使用LayourManagers的基本知识

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的所有类的列表,包括JMenuBarJPanel

因此,JMenuBarJPanelJComponent(或Container)的两个更特殊的版本。

相关内容

  • 没有找到相关文章