本教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本引入的改进,并可能使用不再可用的技术。
请参阅Java语言更改,了解Java SE 9及后续版本中更新的语言特性的概述。
请参阅JDK发行说明,了解有关所有JDK版本的新功能、增强功能和已删除或弃用选项的信息。
使用JInternalFrame
类,您可以在另一个窗口中显示一个类似于JFrame
的窗口。通常,您将内部窗口添加到桌面面板中。而桌面面板可能被用作JFrame
的内容面板。桌面面板是JDesktopPane
的一个实例,它是JLayeredPane
的子类,具有用于管理多个重叠的内部窗口的额外API。
您应该仔细考虑是否要以框架或内部窗口为基础构建程序的GUI。从内部窗口切换到框架或反之不一定是一个简单的任务。通过尝试使用框架和内部窗口,您可以了解选择其中一个的权衡。
下面是一个应用程序的图片,其中包含两个内部窗口(其中一个是图标化的),它们在一个普通框架中:
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); }
使用内部框架的代码在很多方面与使用常规Swing框架的代码相似。因为内部框架有根面板,所以为JInternalFrame
设置GUI非常类似于为JFrame
设置GUI。 JInternalFrame
还提供其他API,例如pack
,使其类似于JFrame
。
就像对于常规框架一样,必须在内部框架上调用setVisible(true)
或show()
才能显示它。除非明确将其设置为可见,否则内部框架不会显示出来。
然而,内部框架不是窗口或顶级容器,这使它们与框架不同。例如,您必须将内部框架添加到容器中(通常是JDesktopPane
);内部框架不能是包含层次结构的根。此外,内部框架不会生成窗口事件。相反,会导致框架触发窗口事件的用户操作将导致内部框架触发内部框架事件。
由于内部框架是使用与平台无关的代码实现的,它们提供了一些框架无法提供的功能。其中一个功能是内部框架比框架更具有控制它们的状态和功能的能力。您可以编程方式使内部框架变成图标化或最大化状态。您还可以指定放置在内部框架标题栏中的图标。甚至可以指定内部框架是否具有支持调整大小、图标化、关闭和最大化的窗口装饰。
另一个功能是内部框架设计用于在桌面窗格中工作。 JInternalFrame
API包含诸如moveToFront
之类的方法,仅在内部框架的容器是分层窗格(例如JDesktopPane
)时才起作用。
如果你已经使用JFrame
和其他Swing组件构建过任何程序,那么你已经了解了如何使用内部框架的很多知识。以下列表总结了使用内部框架的规则。有关更多信息,请参阅如何创建框架和JComponent类。
setSize
,pack
或setBounds
。
setLocation
或setBounds
方法指定内部框架相对于其容器的左上点。
JFrame
的情况完全相同。详见向内容窗格添加组件了解更多详情。
JOptionPane
或JInternalFrame
实现,而不是JDialog
。
JOptionPane
的showInternalXxxDialog
方法,详情请参阅如何创建对话框。
JDesktopPane
),内部框架将不会显示。
show
或setVisible
方法使内部框架可见。
setVisible(true)
或show()
方法使其可见。
当一个桌面拥有许多内部框架时,用户可能会注意到移动它们时速度较慢。轮廓拖动是避免这个问题的一种方法。在轮廓拖动中,只有内部框架的轮廓在当前鼠标位置处绘制,而内部框架的内部部分在拖动时不会在新位置重新绘制。默认行为(称为实时拖动)是在移动内部框架时持续重新定位和重新绘制部分或全部内部框架;如果桌面有许多内部框架,这可能会很慢。
使用JDesktopPane
的setDragMode
*方法来指定轮廓拖动。例如:
desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
以下表格列出了常用的 JInternalFrame
构造方法和方法,以及一些 JDesktopPane
提供的方法。除了本节中列出的 API,JInternalFrame
还从其父类 JComponent
、Component
和 Container
继承了一些有用的 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 继承)。 |
DISPOSE_ON_CLOSE
DO_NOTHING_ON_CLOSE
HIDE_ON_CLOSE
响应窗口关闭事件void addInternalFrameListener(InternalFrameListener)
JInternalFrame
如何编写内部框架监听器void moveToFront()
setClosed
true
void setIcon(boolean)
方法 | 目的 |
---|---|
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() | 创建一个新的JDesktopPane 实例。 |
JInternalFrame[] getAllFrames() | 返回桌面中包含的所有JInternalFrame 对象。 |
JInternalFrame[] getAllFramesInLayer(int) | 返回桌面中包含的所有指定层级的JInternalFrame 对象。有关层级的信息,请参阅如何使用分层面板。 |
void setDragMode(int) int getDragMode() |
设置或获取此桌面中内部框架的拖动模式。整数可以是JDesktopPane.LIVE_DRAG_MODE 或JDesktopPane.OUTLINE_DRAG_MODE 。Java外观的默认值是实时拖动模式。 |
以下示例使用内部框架。由于内部框架类似于常规框架,您还应该查看使用框架的示例。
示例 | 描述位置 | 备注 |
---|---|---|
MyInternalFrame |
本页。 | 实现一个以偏移量显示的内部框架。 |
InternalFrameDemo |
本页。 | 允许您创建进入应用程序的JDesktopPane 的内部框架(MyInternalFrame 的实例)。 |
InternalFrameEventDemo |
如何编写内部框架监听器 | 演示对内部框架事件的监听。还演示了在桌面窗格中定位内部框架。 |