Java JPanel内容窗格混乱

Java JPanel内容窗格混乱,java,swing,layout-manager,jcomponent,jmenubar,Java,Swing,Layout Manager,Jcomponent,Jmenubar,我正在学习JavaSwing,并在框架中添加了一个菜单栏。默认情况下,这应该调用jframe.getContentPane().add(child)。当我运行脚本时,菜单栏没有出现。但如果有意义的话,按钮位于最顶端的“y=0” 然后我意识到我的错误,实际上我不得不在菜单栏中输入菜单。然后菜单栏出现了。所以我想,“菜单栏”“内容窗格”实际上是两个面板吗?这简直把我搞糊涂了。因为这很像一个小组。但是getContentPane()返回一个容器,而不是一个JPanel对象,所以我很困惑 如果是这样,这

我正在学习JavaSwing,并在框架中添加了一个菜单栏。默认情况下,这应该调用
jframe.getContentPane().add(child)
。当我运行脚本时,菜单栏没有出现。但如果有意义的话,按钮位于最顶端的“y=0”

然后我意识到我的错误,实际上我不得不在菜单栏中输入菜单。然后菜单栏出现了。所以我想,“菜单栏”“内容窗格”实际上是两个面板吗?这简直把我搞糊涂了。因为这很像一个小组。但是
getContentPane()
返回一个容器,而不是一个JPanel对象,所以我很困惑

如果是这样,这是否意味着直接转储到帧中的唯一对象就是Jpanel对象?因此jButton、jLabel不直接位于帧中。。。 这是否意味着JPanel是“嵌套的”?
还有一件事让我困惑。如果jpanel可以控制事物的定位方式,那么LayoutManager的用途是什么s 谢谢,请像回答一个2岁的孩子问为什么天空是蓝色的一样回答,哈;)

一些随意的想法:

  • 是的,JPanel和其他组件通常是“嵌套的”。在这一点上,对Swing/AWT布局管理器的深入了解至关重要
  • 虽然JFrame的
    getContentPane()
    返回的类型在技术上是一个容器,但它也是一个JPanel(最终从容器继承)
  • 我相信您可以从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中的字段