Java JPanel内容窗格混乱
我正在学习JavaSwing,并在框架中添加了一个菜单栏。默认情况下,这应该调用Java JPanel内容窗格混乱,java,swing,layout-manager,jcomponent,jmenubar,Java,Swing,Layout Manager,Jcomponent,Jmenubar,我正在学习JavaSwing,并在框架中添加了一个菜单栏。默认情况下,这应该调用jframe.getContentPane().add(child)。当我运行脚本时,菜单栏没有出现。但如果有意义的话,按钮位于最顶端的“y=0” 然后我意识到我的错误,实际上我不得不在菜单栏中输入菜单。然后菜单栏出现了。所以我想,“菜单栏”“内容窗格”实际上是两个面板吗?这简直把我搞糊涂了。因为这很像一个小组。但是getContentPane()返回一个容器,而不是一个JPanel对象,所以我很困惑 如果是这样,这
jframe.getContentPane().add(child)
。当我运行脚本时,菜单栏没有出现。但如果有意义的话,按钮位于最顶端的“y=0”
然后我意识到我的错误,实际上我不得不在菜单栏中输入菜单。然后菜单栏出现了。所以我想,“菜单栏”“内容窗格”实际上是两个面板吗?这简直把我搞糊涂了。因为这很像一个小组。但是getContentPane()
返回一个容器,而不是一个JPanel对象,所以我很困惑
如果是这样,这是否意味着直接转储到帧中的唯一对象就是Jpanel对象?因此jButton、jLabel不直接位于帧中。。。
这是否意味着JPanel是“嵌套的”?
还有一件事让我困惑。如果jpanel可以控制事物的定位方式,那么LayoutManager的用途是什么s 谢谢,请像回答一个2岁的孩子问为什么天空是蓝色的一样回答,哈;) 一些随意的想法:
- 是的,JPanel和其他组件通常是“嵌套的”。在这一点上,对Swing/AWT布局管理器的深入了解至关重要
- 虽然JFrame的
返回的类型在技术上是一个容器,但它也是一个JPanel(最终从容器继承)李>getContentPane()
- 我相信您可以从contentPane容器派生任何内容,但您需要注意它是不透明的
- 对于这一点,有一种方法
frame.setJMenuBar(menuBar);
对于今天的Java Swing GUI,不必从Java5中声明ContentPane
,并默认使用LayoutManager
然后frame.add(myPanel)代码>
//与框架相同。添加(myPanel,BorderLayout.CENTER)
并占用整个容器
关于如何使用getContentPane()
的基本知识总是返回一个容器
实例。但是,您应该注意到JPanel
对象是Container
实例,以及Swing框架中的其他类。返回的实例的实际类是不相关的,因为您无法控制将容器
的哪个实现用作contentPane(除非您强制使用特定的contentPane),而且大多数情况下这应该不是问题
您可以在JFrame
中添加许多GUI小部件,例如JButton
、JLabel
等。但是,它们将自动添加到关联的contentPane中
JPanel
不处理对象定位,与您的面板关联的LayoutManager
处理对象定位;可以根据自己的一组规则(例如,FlowLayout
)自动执行,也可以使用在将对象添加到容器时指定的约束(例如,gridbagloayout
布局管理器)。LayoutManager上的JavaDoc通常包含足够的信息,可以让您开始使用它们
可以有嵌套面板,是的。容器
可以包含其他容器
实例。虽然这似乎是一个复杂的解决方案,但它确实使您能够准确地控制GUI的显示方式。根据您使用的LayoutManager
,根据您必须满足的用户界面需求,以及作为开发人员您自己的喜好/习惯,您可能需要更少或更多的嵌套面板。您需要查看JComponent
的相关内容
如果查看继承层次结构,您将看到JComponent
扩展了Component
,因此JComponent就是一个组件
在直接已知子类下,您还可以看到扩展JComponent
的所有类的列表,包括JMenuBar
和JPanel
因此,
JMenuBar
和JPanel
是JComponent
(或Container
)的两个更专业的版本。看起来像是JPanel扩展了Container。“如果一个jpanel可以控制事物的定位方式,那么LayoutManager是做什么的?”一个jpanel
不能控制事物的定位方式,这正是LayoutManager
所做的。对,我想更多的是关于事物的显示或组织方式,而不是关于屏幕上组件的位置,使用的轻量级容器JFrame
,等等。单击toughtto。那么,在没有使用JMenuBar的情况下,默认情况下是否有一个JPanel?当然,忘记了其他明确的JPanel。如果您添加了一个JMenuBar,默认情况下它会创建2个jpanel?一个用于菜单栏,一个用于内容。为什么布局管理器不同?当你开始的时候,有一个JPanel。如果您添加一个JMenuBar,就会有相同的JPanel,现在是一个JMenuBar,而不是两个JPanel。我不明白你的最后一个问题——为什么布局管理器不同。你是对的。当我尝试使用jframe.add(菜单栏)
时,它实际上没有显示任何内容。使用setJMenuBar(menuBar)
它确实显示了一些东西..这意味着如果它不创建另一个JPanel,那么默认情况下它会将menuBar设置为(0,0)。。。我的意思是,JPanel与布局有何不同,因为JPanel还可以定位项目或其他组件themselves@Hovercraft满是鳗鱼(不确定)也许CardLayout??一个JPanel和一个layout manager是两个完全不同的动物。JPanel和从组件派生的任何东西都使用布局管理器。JPanel是GUI中显示的组件,布局是容器(包括JPanel)排列它们所持有的组件的方式。因此,如果您的JPanel包含其他组件,您最好熟悉它使用的布局管理器以及该布局管理器的工作原理。我可能会更快,但这是一个比我更好的答案。1+困惑…什么时候应该使用setcontentpane和getContentPane()?它们是否引用JFrame中的字段