文档

Java™教程
隐藏目录
如何使用内部框架
路径:使用Swing创建GUI
课程:使用Swing组件
章节:如何使用各种组件

如何使用内部框架

使用JInternalFrame类,您可以在另一个窗口中显示一个类似于JFrame的窗口。通常,您将内部窗口添加到桌面面板中。而桌面面板可能被用作JFrame的内容面板。桌面面板是JDesktopPane的一个实例,它是JLayeredPane的子类,具有用于管理多个重叠的内部窗口的额外API。

您应该仔细考虑是否要以框架或内部窗口为基础构建程序的GUI。从内部窗口切换到框架或反之不一定是一个简单的任务。通过尝试使用框架和内部窗口,您可以了解选择其中一个的权衡。

下面是一个应用程序的图片,其中包含两个内部窗口(其中一个是图标化的),它们在一个普通框架中:

InternalFrameDemo has multiple internal frames, managed by a desktop pane

请尝试: 
  1. 点击“启动”按钮使用Java™ Web Start运行InternalFrameDemo(下载JDK 7或更高版本)。或者,要自己编译和运行示例,请参考示例索引Launches the InternalFrameDemo example
  2. 使用“文档”菜单中的“创建”项目创建新的内部窗口。
    每个内部窗口在前一个内部窗口首次出现的位置的下方和右方30像素处出现。此功能在MyInternalFrame类中实现,它是JInternalFrame的自定义子类。

以下代码来自于InternalFrameDemo.java,创建了前面示例中的桌面和内部窗口。

...//在InternalFrameDemo的构造函数中,一个JFrame的子类:
    desktop = new JDesktopPane();
    createFrame(); //创建第一个窗口
    setContentPane(desktop);
    ...
    //将拖动速度加快一点,但可能会更丑。
    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) {}
}

...//在MyInternalFrame的构造函数中,一个JInternalFrame的子类:
static int openFrameCount = 0;
static final int xOffset = 30, yOffset = 30;

public MyInternalFrame() {
    super("文档 #" + (++openFrameCount),
          true, //可调整大小
          true, //可关闭
          true, //可最大化
          true);//可图标化
    //...创建GUI并放入窗口...
    //...然后设置窗口大小或调用pack...
    ...
    //设置窗口位置。
    setLocation(xOffset*openFrameCount, yOffset*openFrameCount);
}

内部框架 vs. 普通框架

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


注意: 

就像对于常规框架一样,必须在内部框架上调用setVisible(true)show()才能显示它。除非明确将其设置为可见,否则内部框架不会显示出来。


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

由于内部框架是使用与平台无关的代码实现的,它们提供了一些框架无法提供的功能。其中一个功能是内部框架比框架更具有控制它们的状态和功能的能力。您可以编程方式使内部框架变成图标化或最大化状态。您还可以指定放置在内部框架标题栏中的图标。甚至可以指定内部框架是否具有支持调整大小、图标化、关闭和最大化的窗口装饰。

另一个功能是内部框架设计用于在桌面窗格中工作。 JInternalFrame API包含诸如moveToFront之类的方法,仅在内部框架的容器是分层窗格(例如JDesktopPane)时才起作用。

使用内部框架的规则

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

你必须设置内部框架的大小。
如果不设置内部框架的大小,它将具有零大小,因此永远不会可见。你可以使用以下方法之一设置大小:setSizepacksetBounds
通常情况下,你应该设置内部框架的位置。
如果不设置内部框架的位置,它将出现在0,0的位置(容器的左上角)。你可以使用setLocationsetBounds方法指定内部框架相对于其容器的左上点。
要向内部框架添加组件,你需要将它们添加到内部框架的内容窗格中。
这与JFrame的情况完全相同。详见向内容窗格添加组件了解更多详情。
内部框架形式的对话框应该使用JOptionPaneJInternalFrame实现,而不是JDialog
要创建一个简单的对话框,可以使用JOptionPaneshowInternalXxxDialog方法,详情请参阅如何创建对话框
你必须将内部框架添加到一个容器中。
如果不将内部框架添加到一个容器中(通常是JDesktopPane),内部框架将不会显示。
你需要调用showsetVisible方法使内部框架可见。
内部框架默认是不可见的。你必须调用setVisible(true)show()方法使其可见。
内部框架触发内部框架事件,而不是窗口事件。
处理内部框架事件与处理窗口事件几乎相同。详情请参阅如何编写内部框架监听器


性能提示: 

当一个桌面拥有许多内部框架时,用户可能会注意到移动它们时速度较慢。轮廓拖动是避免这个问题的一种方法。在轮廓拖动中,只有内部框架的轮廓在当前鼠标位置处绘制,而内部框架的内部部分在拖动时不会在新位置重新绘制。默认行为(称为实时拖动)是在移动内部框架时持续重新定位和重新绘制部分或全部内部框架;如果桌面有许多内部框架,这可能会很慢。

使用JDesktopPanesetDragMode*方法来指定轮廓拖动。例如:

desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);

内部窗体 API

以下表格列出了常用的 JInternalFrame 构造方法和方法,以及一些 JDesktopPane 提供的方法。除了本节中列出的 API,JInternalFrame 还从其父类 JComponentComponentContainer 继承了一些有用的 API。请参阅 JComponent 类,了解这些类的方法列表。

JInternalFrame 类似,JDesktopPane 也是从 JComponent 继承的,因此提供了 JComponent 类 中描述的方法。由于 JDesktopPane 继承自 JLayeredPane,它还支持 Layered Pane API 中描述的方法。

使用内部窗体的 API 可分为以下几个类别:

创建内部框架
构造函数或方法 目的
JInternalFrame()
JInternalFrame(String)
JInternalFrame(String, boolean)
JInternalFrame(String, boolean, boolean)
JInternalFrame(String, boolean, boolean, boolean)
JInternalFrame(String, boolean, boolean, boolean, boolean)
创建一个JInternalFrame实例。第一个参数指定内部框架要显示的标题(如果有)。其余的参数指定内部框架是否包含装饰,允许用户调整大小、关闭、最大化和图标化内部框架(按照该顺序指定)。每个布尔参数的默认值为false,表示不允许该操作。
static int showInternalConfirmDialog(Component, Object)
static String showInternalInputDialog(Component, Object)
static Object showInternalMessageDialog(Component, Object)
static int showInternalOptionDialog(Component, Object, String, int, int, Icon, Object[], Object)
创建一个模拟对话框的JInternalFrame。详细信息请参见如何创建对话框
向内部框架添加组件
方法 目的
void setContentPane(Container)
Container getContentPane()
设置或获取内部框架的内容面板,一般包含内部框架的所有GUI,除了菜单栏和窗口装饰。
void setJMenuBar(JMenuBar)
JMenuBar getJMenuBar()
设置或获取内部框架的菜单栏。
void setLayeredPane(JLayeredPane)
JLayeredPane getLayeredPane()
设置或获取内部框架的层次面板。
指定内部框架的可见性、大小和位置
方法 目的
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继承)。
在内部框架上执行窗口操作void setDefaultCloseOperation(int)
int getDefaultCloseOperation()DISPOSE_ON_CLOSEDO_NOTHING_ON_CLOSEHIDE_ON_CLOSE响应窗口关闭事件void addInternalFrameListener(InternalFrameListener)
void removeInternalFrameListener(InternalFrameListener)JInternalFrame如何编写内部框架监听器void moveToFront()
void moveToBack()void setClosed(boolean)
boolean isClosed()setClosedtruevoid setIcon(boolean)
boolean isIcon()void setMaximum(boolean)
boolean isMaximum()void setSelected(boolean)
boolean isSelected()
控制窗口装饰和功能
方法 目的
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
构造方法或方法 目的
JDesktopPane() 创建一个新的JDesktopPane实例。
JInternalFrame[] getAllFrames() 返回桌面中包含的所有JInternalFrame对象。
JInternalFrame[] getAllFramesInLayer(int) 返回桌面中包含的所有指定层级的JInternalFrame对象。有关层级的信息,请参阅如何使用分层面板
void setDragMode(int)
int getDragMode()
设置或获取此桌面中内部框架的拖动模式。整数可以是JDesktopPane.LIVE_DRAG_MODEJDesktopPane.OUTLINE_DRAG_MODE。Java外观的默认值是实时拖动模式。

使用内部框架的示例

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

示例 描述位置 备注
MyInternalFrame 本页。 实现一个以偏移量显示的内部框架。
InternalFrameDemo 本页。 允许您创建进入应用程序的JDesktopPane的内部框架(MyInternalFrame的实例)。
InternalFrameEventDemo 如何编写内部框架监听器 演示对内部框架事件的监听。还演示了在桌面窗格中定位内部框架。

上一页: 如何制作框架(主窗口)
下一页: 如何使用标签