Module java.desktop
Package javax.swing

Class JRootPane

所有已实现的接口:
ImageObserver, MenuContainer, Serializable, Accessible

public class JRootPane extends JComponent implements Accessible
JFrameJDialogJWindowJAppletJInternalFrame背后使用的轻量级容器。有关根窗格提供的功能的面向任务的信息,请参阅如何使用根窗格,这是Java教程中的一个部分。

以下图片显示了使用根窗格的类之间的关系。

以下文本描述此图形。

“重量级”组件(那些委托给主机系统上的对等体或本机组件的组件)显示为较暗、较重的框。四个重量级的JFC/Swing容器(JFrameJDialogJWindowJApplet)显示了它们与它们扩展的AWT类的关系。这四个组件是Swing库中唯一的重量级容器。轻量级容器JInternalFrame也显示了出来。这五个JFC/Swing容器都实现了RootPaneContainer接口,并且它们都将它们的操作委托给一个JRootPane(顶部带有一个小“手柄”)。
注意: JComponent方法getRootPane可用于获取包含给定组件的JRootPane

示例:

以下文本描述此图形。

右侧的图表显示了JRootPane的结构。一个JRootpane由一个glassPane、一个可选的menuBar和一个contentPane组成。(JLayeredPane管理menuBarcontentPane。)glassPane位于所有内容的顶部,可以拦截鼠标移动。由于glassPane(如contentPane)可以是任意组件,因此也可以设置glassPane进行绘制。然后,glassPane上的线条和图像可以在其下的框架上移动,而不受其边界的限制。

虽然menuBar组件是可选的,但layeredPanecontentPaneglassPane始终存在。尝试将它们设置为null会生成异常。

要向JRootPane添加组件(除了可选的菜单栏),您可以将对象添加到JRootPanecontentPane中,如下所示:

       rootPane.getContentPane().add(child);
 
相同的原则也适用于设置布局管理器、移除组件、列出子组件等。所有这些方法都在contentPane上调用,而不是在JRootPane上调用。
注意: contentPane的默认布局管理器是BorderLayout管理器。但是,JRootPane使用自定义的LayoutManager。因此,当您想要更改添加到JRootPane的组件的布局管理器时,请确保使用以下代码:
    rootPane.getContentPane().setLayout(new BoxLayout());
 
如果在JRootPane上设置了JMenuBar组件,则它将位于框架的上边缘。contentPane的位置和大小将调整以填充剩余区域。(JMenuBarcontentPane将添加到layeredPane组件的JLayeredPane.FRAME_CONTENT_LAYER层。)

layeredPaneJRootPane中所有子组件的父级--作为菜单的直接父级和添加到contentPane的所有组件的祖父级。它是JLayeredPane的一个实例,提供在几个层中添加组件的能力。当需要将组件放置在面板中的所有其他组件的顶部时,这种能力非常有用,例如在菜单弹出、对话框和拖动时。

glassPane位于JRootPane中所有其他组件的顶部。这提供了一个方便的位置来在所有其他组件的上方绘制,并且可以拦截鼠标事件,这对于拖动和绘制都很有用。开发人员可以使用setVisibleglassPane上控制glassPane何时显示在其他子组件的上方。默认情况下,glassPane是不可见的。

JRootPane使用的自定义LayoutManager确保:

  1. glassPane填充JRootPane的整个可视区域(边界 - 内边距)。
  2. layeredPane填充JRootPane的整个可视区域(边界 - 内边距)。
  3. menuBar位于layeredPane的上边缘。
  4. contentPane填充整个可视区域,如果存在menuBar则减去menuBar
JRootPane视图层次结构中的任何其他视图都将被忽略。

如果替换JRootPaneLayoutManager,则您需要负责管理所有这些视图。因此,通常您会希望确保更改contentPane的布局管理器,而不是JRootPane本身!

Swing的绘制架构要求在所有其他组件的上方存在一个不透明的JComponent。通常通过内容窗格提供此功能。如果替换内容窗格,则建议通过setOpaque(true)使内容窗格不透明。此外,如果内容窗格覆盖了paintComponent,则需要在paintComponent中完全填充不透明颜色的背景。

警告: Swing不是线程安全的。有关更多信息,请参阅Swing的线程策略

警告: 此类的序列化对象将不兼容未来的Swing版本。当前的序列化支持适用于短期存储或在运行相同版本Swing的应用程序之间进行RMI。从1.4版本开始,已将所有JavaBeans的长期存储支持添加到java.beans包中。请参阅XMLEncoder

自从:
1.2
参见:
  • Field Details

    • NONE

      public static final int NONE
      用于windowDecorationStyle属性的常量。指示JRootPane不应提供任何窗口装饰。
      自:
      1.4
      另请参阅:
    • FRAME

      public static final int FRAME
      用于windowDecorationStyle属性的常量。指示JRootPane应提供适用于框架的装饰。
      自:
      1.4
      另请参阅:
    • PLAIN_DIALOG

      public static final int PLAIN_DIALOG
      用于windowDecorationStyle属性的常量。指示JRootPane应提供适用于对话框的装饰。
      自:
      1.4
      另请参阅:
    • INFORMATION_DIALOG

      public static final int INFORMATION_DIALOG
      用于windowDecorationStyle属性的常量。指示JRootPane应提供适用于显示信息消息的对话框的装饰。
      自:
      1.4
      另请参阅:
    • ERROR_DIALOG

      public static final int ERROR_DIALOG
      用于windowDecorationStyle属性的常量。指示JRootPane应提供适用于显示错误消息的对话框的装饰。
      自:
      1.4
      另请参阅:
    • COLOR_CHOOSER_DIALOG

      public static final int COLOR_CHOOSER_DIALOG
      用于windowDecorationStyle属性的常量。指示JRootPane应提供适用于显示JColorChooser的对话框的装饰。
      自:
      1.4
      另请参阅:
    • FILE_CHOOSER_DIALOG

      public static final int FILE_CHOOSER_DIALOG
      用于windowDecorationStyle属性的常量。指示JRootPane应提供适用于显示JFileChooser的对话框的装饰。
      自:
      1.4
      另请参阅:
    • QUESTION_DIALOG

      public static final int QUESTION_DIALOG
      用于windowDecorationStyle属性的常量。指示JRootPane应提供适用于向用户提出问题的对话框的装饰。
      自:
      1.4
      另请参阅:
    • WARNING_DIALOG

      public static final int WARNING_DIALOG
      用于windowDecorationStyle属性的常量。指示JRootPane应提供适用于显示警告消息的对话框的装饰。
      自:
      1.4
      另请参阅:
    • contentPane

      protected Container contentPane
      内容窗格。
    • layeredPane

      protected JLayeredPane layeredPane
      管理菜单栏和内容窗格的分层窗格。
    • glassPane

      protected Component glassPane
      覆盖菜单栏和内容窗格的玻璃窗格,以便它可以拦截鼠标移动等操作。
    • defaultButton

      protected JButton defaultButton
      当窗格具有焦点并发生类似按下Enter键的UI特定操作时激活的按钮。
  • Constructor Details

    • JRootPane

      public JRootPane()
      创建一个JRootPane,设置其glassPanelayeredPanecontentPane
  • Method Details

    • setDoubleBuffered

      public void setDoubleBuffered(boolean aFlag)
      设置此组件是否应使用缓冲区进行绘制。如果设置为true,则此组件的所有绘图将在离屏绘图缓冲区中完成。然后将离屏绘图缓冲区复制到屏幕上。如果一个Component被缓冲,并且其祖先之一也被缓冲,则将使用祖先缓冲区。
      覆盖:
      setDoubleBuffered 在类 JComponent
      参数:
      aFlag - 如果为true,则将此组件设置为双缓冲
      自:
      1.6
    • getWindowDecorationStyle

      public int getWindowDecorationStyle()
      返回一个常量,标识JRootPane提供的窗口装饰的类型。
      返回:
      NONEFRAMEPLAIN_DIALOGINFORMATION_DIALOGERROR_DIALOGCOLOR_CHOOSER_DIALOGFILE_CHOOSER_DIALOGQUESTION_DIALOGWARNING_DIALOG中的一个。
      自:
      1.4
      另请参阅:
    • setWindowDecorationStyle

      @BeanProperty(expert=true, visualUpdate=true, enumerationValues={"JRootPane.NONE","JRootPane.FRAME","JRootPane.PLAIN_DIALOG","JRootPane.INFORMATION_DIALOG","JRootPane.ERROR_DIALOG","JRootPane.COLOR_CHOOSER_DIALOG","JRootPane.FILE_CHOOSER_DIALOG","JRootPane.QUESTION_DIALOG","JRootPane.WARNING_DIALOG"}, description="Identifies the type of Window decorations to provide") public void setWindowDecorationStyle(int windowDecorationStyle)
      设置JRootPane应提供的窗口装饰的类型(例如边框,用于关闭窗口的小部件,标题...)。默认情况下提供不提供任何窗口装饰(NONE)。

      这仅是一个提示,某些外观可能不支持此功能。这是一个绑定属性。

      参数:
      windowDecorationStyle - 标识要提供的窗口装饰的常量。
      抛出:
      IllegalArgumentException - 如果style不是以下之一:NONEFRAMEPLAIN_DIALOGINFORMATION_DIALOGERROR_DIALOGCOLOR_CHOOSER_DIALOGFILE_CHOOSER_DIALOGQUESTION_DIALOGWARNING_DIALOG
      自:
      1.4
      另请参阅:
    • getUI

      public RootPaneUI getUI()
      返回呈现此组件的L&F对象。
      覆盖:
      getUI 在类 JComponent
      返回:
      LabelUI对象
      自:
      1.3
    • setUI

      @BeanProperty(expert=true, hidden=true, visualUpdate=true, description="The UI object that implements the Component\'s LookAndFeel.") public void setUI(RootPaneUI ui)
      设置呈现此组件的L&F对象。
      参数:
      ui - LabelUI L&F对象
      自:
      1.3
      另请参阅:
    • updateUI

      public void updateUI()
      将UI属性重置为当前外观的值。
      覆盖:
      updateUI 在类 JComponent
      另请参阅:
    • getUIClassID

      public String getUIClassID()
      返回一个指定呈现此组件的L&F类的名称的字符串。
      覆盖:
      getUIClassID 在类 JComponent
      返回:
      字符串"RootPaneUI"
      另请参阅:
    • createLayeredPane

      protected JLayeredPane createLayeredPane()
      由构造方法调用,创建默认的layeredPane。默认情况下,它创建一个新的JLayeredPane
      返回:
      默认的layeredPane
    • createContentPane

      protected Container createContentPane()
      由构造方法调用,创建默认的contentPane。默认情况下,此方法创建一个新的JComponent并将BorderLayout设置为其LayoutManager
      返回值:
      默认的contentPane
    • createGlassPane

      protected Component createGlassPane()
      由构造方法调用以创建默认的glassPane。默认情况下,此方法创建一个新的JComponent,其可见性设置为false。
      返回值:
      默认的glassPane
    • createRootLayout

      protected LayoutManager createRootLayout()
      由构造方法调用以创建默认的layoutManager
      返回值:
      默认的layoutManager
    • setJMenuBar

      public void setJMenuBar(JMenuBar menu)
      添加或更改分层窗格中使用的菜单栏。
      参数:
      menu - 要添加的JMenuBar
    • setMenuBar

      @Deprecated public void setMenuBar(JMenuBar menu)
      Deprecated.
      As of Swing version 1.0.3 replaced by setJMenuBar(JMenuBar menu).
      指定菜单栏的值。
      参数:
      menu - 要添加的JMenuBar
    • getJMenuBar

      public JMenuBar getJMenuBar()
      从分层窗格返回菜单栏。
      返回值:
      在窗格中使用的JMenuBar
    • getMenuBar

      @Deprecated public JMenuBar getMenuBar()
      Deprecated.
      As of Swing version 1.0.3 replaced by getJMenuBar().
      返回菜单栏的值。
      返回值:
      在窗格中使用的JMenuBar
    • setContentPane

      public void setContentPane(Container content)
      设置内容窗格——容纳由根窗格父级的组件。

      Swing的绘制架构要求在包含层次结构中有一个不透明的JComponent。这通常由内容窗格提供。如果替换内容窗格,则建议用不透明的JComponent替换它。

      参数:
      content - 用于组件内容的Container
      抛出:
      IllegalComponentStateException - (运行时异常),如果内容窗格参数为null
    • getContentPane

      public Container getContentPane()
      返回内容窗格——容纳由根窗格父级的组件。
      返回值:
      包含组件内容的Container
    • setLayeredPane

      public void setLayeredPane(JLayeredPane layered)
      设置根窗格的分层窗格。分层窗格通常包含内容窗格和可选的JMenuBar
      参数:
      layered - 要使用的JLayeredPane
      抛出:
      IllegalComponentStateException - (运行时异常),如果分层窗格参数为null
    • getLayeredPane

      public JLayeredPane getLayeredPane()
      获取根窗格使用的分层窗格。分层窗格通常包含内容窗格和可选的JMenuBar
      返回值:
      当前使用的JLayeredPane
    • setGlassPane

      public void setGlassPane(Component glass)
      设置指定的Component作为此根窗格的玻璃窗格。玻璃窗格通常应该是一个轻量级、透明的组件,因为当根窗格需要捕获输入事件时,它将被显示出来。

      新玻璃窗格的可见性将更改以匹配当前玻璃窗格的可见性。这意味着在想要替换玻璃窗格并使其可见时必须小心。以下任一方法都可以工作:

         root.setGlassPane(newGlassPane);
         newGlassPane.setVisible(true);
       
      或者:
         root.getGlassPane().setVisible(true);
         root.setGlassPane(newGlassPane);
       
      参数:
      glass - 用作此JRootPane玻璃窗格的Component
      抛出:
      NullPointerException - 如果glass参数为null
    • getGlassPane

      public Component getGlassPane()
      返回此JRootPane的当前玻璃窗格。
      返回值:
      当前玻璃窗格
      另请参阅:
    • isValidateRoot

      public boolean isValidateRoot()
      如果此JRootPane的后代调用revalidate,则从此处开始验证。

      延迟请求重新布局组件及其后代。例如,对revalidate的调用被推送到JRootPaneJScrollPane,因为这两个类都重写了isValidateRoot以返回true。

      覆盖:
      isValidateRoot 在类 JComponent
      返回值:
      true
      另请参阅:
    • isOptimizedDrawingEnabled

      public boolean isOptimizedDrawingEnabled()
      glassPanecontentPane具有相同的边界,这意味着JRootPane不会平铺其子级,因此应返回false。另一方面,glassPane通常不可见,因此如果glassPane不可见,则可以返回true。因此,此处的返回值取决于glassPane的可见性。
      覆盖:
      isOptimizedDrawingEnabled 在类 JComponent
      返回值:
      如果此组件的子级不重叠,则返回true
    • setDefaultButton

      @BeanProperty(description="The button activated by default in this root pane") public void setDefaultButton(JButton defaultButton)
      设置defaultButton属性,确定此JRootPane的当前默认按钮。默认按钮是在根窗格中发生UI定义的激活事件(通常是Enter键)时将被激活的按钮,无论该按钮是否具有键盘焦点(除非根窗格内有另一个组件消耗激活事件,如JTextPane)。要使默认激活起作用,当激活发生时,按钮必须是根窗格的启用后代。要从此根窗格中删除默认按钮,请将此属性设置为null
      参数:
      defaultButton - 要成为默认按钮的JButton
      另请参阅:
    • getDefaultButton

      public JButton getDefaultButton()
      返回defaultButton属性的值。
      返回值:
      当前默认按钮的JButton
      另请参阅:
    • addImpl

      protected void addImpl(Component comp, Object constraints, int index)
      覆盖以强制执行玻璃组件的位置为零子级。
      覆盖:
      addImpl 在类 Container
      参数:
      comp - 要增强的组件
      constraints - 要遵守的约束
      index - 索引
      另请参阅:
    • paramString

      protected String paramString()
      返回此JRootPane的字符串表示形式。此方法仅用于调试目的,返回的字符串的内容和格式可能因实现而异。返回的字符串可能为空,但不能为null
      覆盖:
      paramString 在类 JComponent
      返回值:
      JRootPane的字符串表示形式。
    • getAccessibleContext

      public AccessibleContext getAccessibleContext()
      获取与此JRootPane关联的AccessibleContext。对于根窗格,AccessibleContext采用AccessibleJRootPane的形式。如果需要,将创建一个新的AccessibleJRootPane实例。
      指定者:
      getAccessibleContext 在接口 Accessible
      覆盖:
      getAccessibleContext 在类 Component
      返回值:
      作为此JRootPaneAccessibleContextAccessibleJRootPane