如何使用内部框架

使用JInternalFrame类,您可以在另一个窗口中显示类似JFrame的窗口。通常,您将内部框架添加到桌面窗格中。桌面窗格又可以用作JFrame的内容窗格。桌面窗格是JDesktopPane的实例,它是JLayeredPane的子类,它已添加用于 管理 多个重叠内部框架的 API。

您应该仔细考虑是将程序的 GUI 基于框架还是内部框架。从内部框架切换到框架,反之亦然,这不一定是简单的任务。通过对框架和内部框架进行试验,您可以了解选择一个框架与另一个框架之间的权衡。

这是一个应用程序的图片,该应用程序在常规框架内有两个内部框架(其中一个已图标化):

InternalFrameDemo 具有多个内部框架,由桌面窗格 管理

Try this:

  • 单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行 InternalFrameDemo。另外,要自己编译和运行示例,请查阅example index

  • 使用“文档”菜单中的“创建”项创建新的内部框架。
    每个内部框架的位置比上一个内部框架首次出现的位置低 30 像素,位于右侧。此功能是在MyInternalFrame类(即JInternalFrame的自定义子类)中实现的。

以下代码取自InternalFrameDemo.java,在上一个示例中创建了桌面框架和内部框架。

...//In the constructor of InternalFrameDemo, a JFrame subclass:
    desktop = new JDesktopPane();
    createFrame(); //Create first window
    setContentPane(desktop);
    ...
    //Make dragging a little faster but perhaps uglier.
    desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
...
protected void createFrame() {
    MyInternalFrame frame = new MyInternalFrame();
    frame.setVisible(true);
    desktop.add(frame);
    try {
        frame.setSelected(true);
    } catch (java.beans.PropertyVetoException e) {}
}

...//In the constructor of MyInternalFrame, a JInternalFrame subclass:
static int openFrameCount = 0;
static final int xOffset = 30, yOffset = 30;

public MyInternalFrame() {
    super("Document #" + (++openFrameCount),
          true, //resizable
          true, //closable
          true, //maximizable
          true);//iconifiable
    //...Create the GUI and put it in the window...
    //...Then set the window size or call pack...
    ...
    //Set the window's location.
    setLocation(xOffset*openFrameCount, yOffset*openFrameCount);
}

内部框架与常规框架

使用内部框架的代码在许多方面与使用常规 Swing 框架的代码相似。因为内部框架具有根窗格,所以为JInternalFrame设置 GUI 与为JFrame设置 GUI 非常相似。 JInternalFrame还提供了其他 API,例如pack,使其与JFrame类似。

Note:

与常规框架一样,您必须在内部框架上调用setVisible(true)show()才能显示它。内部框架直到您显式使其可见后才会出现。

内部框架不是窗口或顶级容器,但是,它们与框架不同。例如,必须将内部框架添加到容器(通常是JDesktopPane);内部框架不能是容纳层次结构的根。此外,内部框架不会生成窗口事件。而是会导致框架触发窗口事件的用户操作导致内部框架触发内部框架事件。

由于内部框架是通过与平台无关的代码实现的,因此它们增加了框架无法提供的某些功能。这样的功能之一就是内部框架比框架对您的状态和功能有更多的控制。您可以以编程方式图标化或最大化内部框架。您还可以指定内部框架标题栏中的图标。您甚至可以指定内部框架是否具有窗口装饰,以支持调整大小,图标化,关闭和最大化。

另一个功能是内部框架旨在在桌面窗格中工作。 JInternalFrame API 包含诸如moveToFront之类的方法,这些方法仅在内部框架的容器是诸如JDesktopPane之类的分层窗格时才有效。

使用内部框架的规则

如果您已经使用JFrame和其他 Swing 组件构建了任何程序,那么您已经知道如何使用内部框架。以下列表总结了使用内部框架的规则。有关更多信息,请参见如何制作框架JComponent 类

  • 您必须设置内部框架的大小.

    • 如果不设置内部框架的大小,则内部框架的大小将为零,因此永远不会可见。您可以使用以下方法之一设置大小:setSizepacksetBounds
  • 通常,应设置内部框架的位置.

    • 如果未设置内部框架的位置,则内部框架将位于 0,0(其容器的左上角)处。您可以使用setLocationsetBounds方法来指定内部框架相对于其容器的左上点。
  • 要将组件添加到内部框架,请将它们添加到内部框架的内容窗格中.

  • 属于内部框架的对话框应使用JOptionPaneJInternalFrame而不是JDialog来实现.

    • 要创建一个简单的对话框,可以使用如何制作对话框所述的JOptionPane showInternalXxxDialog方法。
  • 您必须在容器中添加内部框架.

    • 如果不将内部框架添加到容器(通常是JDesktopPane),则内部框架将不会出现。
  • 您需要在内部框架上调用showsetVisible.

    • 默认情况下,内部框架是不可见的。您必须调用setVisible(true)show()使其可见。
  • 内部框架触发内部框架事件,而不是窗口事件.

Performance tip:

当台式机具有许多内部框架时,用户可能会注意到移动它们的速度似乎很慢。拖动轮廓是避免此问题的一种方法。通过轮廓拖动,在拖动内部框架时,仅在内部鼠标的当前位置绘制内部框架的轮廓。内部框架的内部不会在新的位置重新绘制,直到拖动停止。默认行为(称为“实时”拖动)是在移动内部框架时连续对其进行重新定位和重新绘制;如果桌面上有许多内部框架,这可能会很慢。

使用JDesktopPane方法setDragMode *指定拖动轮廓。例如:

desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);

内部框架 API

下表列出了常用的JInternalFrame构造函数和方法,以及JDesktopPane提供的一些方法。除了本节中列出的 API 外,JInternalFrame从其超类JComponentComponentContainer继承有用的 API。有关这些类的方法列表,请参见JComponent 类

JInternalFrame一样,JDesktopPaneJComponent继承而来,因此提供了JComponent 类中描述的方法。由于JDesktopPane扩展了JLayeredPane,因此它也支持分层窗格 API中描述的方法。

使用内部框架的 API 分为以下几类:

创建内部框架

构造函数或方法Purpose
JInternalFrame()

JInternalFrame(String)
JInternalFrame(String, boolean)
JInternalFrame(String,boolean,boolean)
JInternalFrame(String,boolean,boolean,boolean)
JInternalFrame(String,boolean,boolean,boolean,boolean)
创建JInternalFrame实例。第一个参数指定要由内部框架显示的标题(如果有)。其余参数指定内部框架是否应包含装饰,以允许用户调整内部框架的大小,关闭,最大化和图标化(按该 Sequences 指定)。 )
静态 int showInternalConfirmDialog(Component,Object)
静态字符串showInternalInputDialog(Component,Object)
静态对象 showInternalMessageDialog(Component,Object)
静态 int showInternalOptionDialog(组件,对象,字符串,int,int,图标,Object [],Object)
创建模拟对话框的JInternalFrame。有关详情,请参见如何制作对话框

将组件添加到内部框架

MethodPurpose
void setContentPane(Container)

Container getContentPane()
设置或获取内部框架的内容窗格,该窗格通常包含内部框架的所有 GUI,但菜单栏和窗口装饰除外。
void setJMenuBar(JMenuBar)
JMenuBar getJMenuBar()
设置或获取内部框架的菜单栏。
void setLayeredPane(JLayeredPane)
JLayeredPane getLayeredPane()
设置或获取内部框架的分层窗格。

指定内部框架的可见性,大小和位置

MethodPurpose
void setVisible(boolean)使内部框架可见(如果true)或不可见(如果false)。您应在每个JInternalFrame上调用setVisible(true),然后再将其添加到其容器中。 (继承自Component)。
void pack()调整内部框架的尺寸,使其组件处于其首选的尺寸。
void setLocation(Point)

void setLocation(int,int)
设置内部框架的位置。 (继承自Component)。
void setBounds(Rectangle)
void setBounds(int,int,int,int)
明确设置内部框架的大小和位置。 (继承自Component)。
void setSize(Dimension)
void setSize(int,int)
明确设置内部框架的大小。 (继承自Component)。

在内部框架上执行窗口操作

MethodPurpose
void setDefaultCloseOperation(int)

int getDefaultCloseOperation()
设置或获取用户try“关闭”内部框架时内部框架的功能。默认值为DISPOSE_ON_CLOSE。其他可能的值为DO_NOTHING_ON_CLOSEHIDE_ON_CLOSE有关详细信息,请参见响应窗口关闭事件
void addInternalFrameListener(InternalFrameListener)
void removeInternalFrameListener(InternalFrameListener)
添加或删除内部框架侦听器(JInternalFrame等效于窗口侦听器)。有关更多信息,请参见如何编写内部框架侦听器
void moveToFront()
void moveToBack()
如果内部框架的父级是分层窗格(例如桌面窗格),则将内部框架分别移动到其层的前面或后面。
void setClosed(boolean)
boolean isClosed()
设置或获取内部框架当前是否关闭。 setClosed的参数必须为true。当重新打开封闭的内部框架时,将其显示为可见并将其添加到容器中(通常是您最初将其添加到的桌面窗格)。
void setIcon(boolean)
boolean isIcon()
对内部框架进行图标化或去图标化,或者确定当前是否已对其进行图标化。
void setMaximum(boolean)
boolean isMaximum()
最大化或恢复内部框架,或确定是否最大化。
void setSelected(boolean)
boolean isSelected()
设置或获取内部框架是否为当前“选定”(激活)的内部框架。

控制窗户装饰和功能

MethodPurpose
void setFrameIcon(Icon)

Icon getFrameIcon()
设置或获取显示在内部框架标题栏中的图标(通常在左上角)。
void setClosable(boolean)
boolean isClosable()
设置或获取用户是否可以关闭内部框架。
void setIconifiable(boolean)
boolean isIconifiable()
设置或获取是否可以图标化内部框架。
void setMaximizable(boolean)
boolean isMaximizable()
设置或获取用户是否可以最大化此内部框架。
void setResizable(boolean)
boolean isResizable()
设置或获取是否可以调整内部框架的大小。
void setTitle(String)
String getTitle()
设置或获取窗口标题。

使用 JDesktopPane API

构造函数或方法Purpose
JDesktopPane()创建一个新的JDesktopPane实例。
JInternalFrame[] getAllFrames()返回桌面包含的所有JInternalFrame对象。
JInternalFrame[] getAllFramesInLayer(int)返回桌面包含的所有JInternalFrame对象,位于指定层中。有关图层的信息,请参见如何使用分层窗格
void setDragMode(int)

int getDragMode()
设置或获取用于此桌面内部框架的拖动 Pattern。整数可以是JDesktopPane.LIVE_DRAG_MODEJDesktopPane.OUTLINE_DRAG_MODE。 Java 外观的默认设置为实时拖动 Pattern。

使用内部框架的示例

以下示例使用内部框架。由于内部框架与常规框架相似,因此您还应该查看使用框架的示例

ExampleWhere DescribedNotes
MyInternalFrameThis page.实现一个内部框架,该内部框架与先前创建的内部框架offset。
InternalFrameDemoThis page.使您可以创建进入应用程序JDesktopPane的内部框架(实例为MyInternalFrame)。
InternalFrameEventDemo如何编写内部框架侦听器演示侦听内部框架事件。还演示了如何将内部框架放置在桌面窗格中。