模块 java.desktop

类 JRootPane

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

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

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

The following text describes this graphic.

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

示例:

the following text describes this graphic.

右图显示了 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 添加到 JLayeredPane.FRAME_CONTENT_LAYER 层的 layeredPane 组件。)

layeredPaneJRootPane 中所有子项的父级——既是菜单的直接父级,也是添加到 contentPane 的所有组件的祖父级。它是 JLayeredPane 的一个实例,它提供了在多个层添加组件的能力。在使用菜单弹出窗口、对话框和拖动时,此功能非常有用——在这些情况下,您需要将一个组件放置在窗格中所有其他组件的顶部。

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

JRootPane 使用的自定义 LayoutManager 确保:

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

如果您将 LayoutManager 替换为 JRootPane ,您将负责管理所有这些视图。所以通常你会想要确保你改变了contentPane而不是JRootPane本身的布局管理器!

Swing 的绘画架构需要一个不透明的 JComponent 存在于所有其他组件之上的包含层次结构中。这通常通过内容窗格提供。如果替换内容窗格,建议您通过 setOpaque(true) 使内容窗格不透明。此外,如果内容窗格覆盖 paintComponent ,则需要在 paintComponent 中用不透明颜色完全填充背景。

Warning: Swing 不是线程安全的。有关详细信息,请参阅 Swing 的线程策略

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

自从:
1.2
参见:
  • 字段详细信息

    • 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
      当窗格具有焦点和特定于 UI 的操作(如按下进入键发生。
  • 构造方法详细信息

    • JRootPane

      public JRootPane()
      创建一个 JRootPane ,设置它的 glassPanelayeredPanecontentPane
  • 方法详情

    • setDoubleBuffered

      public void setDoubleBuffered(boolean aFlag)
      设置此组件是否应使用缓冲区进行绘制。如果设置为 true,则此组件的所有绘制都将在屏幕外绘制缓冲区中完成。屏幕外绘画缓冲区将被复制到屏幕上。如果 Component 被缓冲并且其祖先之一也被缓冲,则将使用祖先缓冲区。
      重写:
      setDoubleBuffered 在类 JComponent
      参数:
      aFlag - 如果为真,则将此组件设置为双缓冲
      自从:
      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 。 Bt 默认创建一个新的 JLayeredPane
      返回:
      默认layeredPane
    • createContentPane

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

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

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

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

      @Deprecated public void setMenuBar(JMenuBar  menu)
      已弃用。
      从 Swing 版本 1.0.3 开始,由 setJMenuBar(JMenuBar menu) 取代。
      指定菜单栏值。
      参数:
      menu - 要添加的 JMenuBar
    • getJMenuBar

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

      @Deprecated public JMenuBar  getMenuBar()
      已弃用。
      从 Swing 版本 1.0.3 开始,由 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 - Component 用作此 JRootPane 的玻璃板
      抛出:
      NullPointerException - 如果 glass 参数是 null
    • getGlassPane

      public Component  getGlassPane()
      返回此 JRootPane 的当前玻璃窗格。
      返回:
      当前的 glass pane
      参见:
    • 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
      返回:
      如果此组件的子组件不重叠,则为真
    • setDefaultButton

      @BeanProperty (description ="The button activated by default in this root pane") public void setDefaultButton(JButton  defaultButton)
      设置 defaultButton 属性,该属性确定此 JRootPane 的当前默认按钮。默认按钮是在 UI 定义的激活事件(通常是进入key) 出现在根窗格中,无论按钮是否具有键盘焦点(除非根窗格中有另一个组件使用激活事件,例如 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
      返回:
      一个 AccessibleJRootPane 作为这个 JRootPaneAccessibleContext