如何制作框架(主窗口)
框架是带有标题和边框的顶级窗口。边框的大小包括为边框指定的任何区域。可以使用getInsets
方法获得边界区域的尺寸。由于边框区域包括在框架的整体大小中,因此边框有效地遮盖了框架的一部分,从而限制了可用于渲染和/或显示子组件的区域到左上角位置为(insets.left
,insets.top)
的矩形,大小为width - (insets.left + insets.right)
x height - (insets.top + insets.bottom)
。
实现为JFrame类的实例的框架是具有装饰(例如边框,标题)并支持关闭或图标化该窗口的按钮组件的窗口。具有 GUI 的应用程序通常至少包含一帧。Servlets 有时也使用框架。
要创建依赖于另一个窗口的窗口(例如,当另一个窗口被图标化时消失),请使用dialog而不是frame.
。要使一个窗口出现在另一个窗口中,请使用internal frame。
创建和显示框架
这是FrameDemo
演示应用程序创建的极其简单的窗口的图片。您可以在FrameDemo.java中找到源代码。您可以run FrameDemo(下载 JDK 7 或更高版本)。
以下FrameDemo
代码显示了如何创建和设置框架。
//1. Create the frame.
JFrame frame = new JFrame("FrameDemo");
//2. Optional: What happens when the frame closes?
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//3. Create components and put them in the frame.
//...create emptyLabel...
frame.getContentPane().add(emptyLabel, BorderLayout.CENTER);
//4. Size the frame.
frame.pack();
//5. Show it.
frame.setVisible(true);
以下是有关代码的一些详细信息:
-
代码的第一行使用构造函数创建框架,该构造函数可用于设置框架标题。另一个常用的
JFrame
构造函数是无参数构造函数。 -
接下来,代码指定当用户关闭框架时会发生什么。当您的用户关闭框架时,
EXIT_ON_CLOSE
操作将退出程序。此行为适用于此程序,因为该程序只有一帧,而关闭该帧会使该程序无用。
有关更多信息,请参见响应窗口关闭事件。
- 下一段代码将空白标签添加到框架内容窗格。如果您还不熟悉内容窗格以及如何向其中添加组件,请阅读将组件添加到内容窗格。
对于具有菜单的框架,通常使用setJMenuBar
方法将菜单栏添加到此处。有关详情,请参见如何使用菜单。
pack
方法调整框架的大小,以便其所有内容等于或大于其首选大小。pack
的替代方法是通过调用setSize
或setBounds
(这也会设置帧位置)显式构建帧大小。通常,使用pack
比调用setSize
更可取,因为pack
让框架布局 管理 器负责框架大小,并且布局 管理 器擅 Long 适应平台依赖性和影响组件大小的其他因素。
本示例未设置框架位置,但是使用setLocationRelativeTo
或setLocation
方法很容易做到。例如,以下代码在屏幕上居中显示框架:
frame.setLocationRelativeTo(null);
- 调用
setVisible(true)
可使框架显示在屏幕上。有时您可能会看到使用show
方法代替。这两种用法是等效的,但是为了保持一致,我们使用setVisible(true)
。
指定窗户装饰
默认情况下,窗口装饰由本机窗口系统提供。但是,您可以要求外观为框架提供装饰。您还可以指定框架完全没有窗户装饰,可以单独使用该功能,也可以提供自己的装饰,或者使用全屏独占 Pattern。
除了指定谁提供窗户装饰之外,您还可以指定使用哪个图标表示窗户。此图标的确切使用方式取决于窗口系统或提供窗口装饰的外观。如果窗口系统支持最小化,则使用图标表示最小化的窗口。大多数窗口系统或外观也会在窗口装饰中显示图标。典型的图标大小为 16x16 像素,但是某些窗口系统使用其他大小。
以下快照显示了三个相同的框架,除了它们的窗口装饰。从每帧中按钮的外观可以看出,这三个按钮均使用 Java 外观。第一种使用窗口系统提供的装饰,碰巧是 Microsoft Windows,但也很可能是运行 Java 平台的任何其他系统。第二种和第三种使用 Java 外观提供的窗口装饰。第三帧使用 Java 外观窗口装饰,但具有自定义图标。
|
|
|
窗户装饰所提供的外观和感觉 | 窗户系统提供的窗户装饰 | 自定义图标;外观提供的窗户装饰 |
以下是使用自定义图标和外观提供的窗口装饰创建框架的示例:
//Ask for window decorations provided by the look and feel.
JFrame.setDefaultLookAndFeelDecorated(true);
//Create the frame.
JFrame frame = new JFrame("A window");
//Set the frame icon to an image loaded from a file.
frame.setIconImage(new ImageIcon(imgURL).getImage());
正如前面的代码片段所暗示的那样,您必须在创建希望影响其装饰的框架之前,调用setDefaultLookAndFeelDecorated
方法。您使用setDefaultLookAndFeelDecorated
设置的值将用于所有随后创建的JFrame
。您可以通过调用JFrame.setDefaultLookAndFeelDecorated(false)
切换回使用窗口系统装饰。有些外观可能不支持窗户装饰。在这种情况下,将使用窗户系统装饰。
用于创建上图所示框架的应用程序的完整源代码在FrameDemo2.java中。除了显示如何选择窗口装饰之外,FrameDemo2 还显示了如何禁用所有窗口装饰,并提供了定位窗口的示例。它包括创建Image
对象用作图标的两种方法-一种是从文件加载的,另一种是从头开始绘制的。
Try this::
-
单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行 Frame Demo。另外,要自己编译和运行示例,请查阅example index。
-
调出两个带有装饰感的窗口,但带有不同的图标。
Java 外观在其窗口装饰中显示图标。根据您的窗口系统,图标可能会在其他地方用于表示窗口,尤其是在窗口最小化时。 -
调出带有窗户系统装饰物的一个或多个窗户。
查看您的窗口系统是否以不同的方式对待这些图标。 -
调出一个或多个没有窗户装饰的窗户。
玩各种类型的窗户,看看窗户装饰,窗户系统和框架图标是如何相互作用的。
响应窗口关闭事件
默认情况下,当用户关闭屏幕上的框架时,该框架是隐藏的。尽管不可见,但框架仍然存在,程序可以使其再次可见。如果需要其他行为,则需要注册一个用于处理关闭窗口事件的窗口侦听器,或者需要使用setDefaultCloseOperation
方法指定默认关闭行为。您甚至都可以做。
setDefaultCloseOperation
的参数必须是以下值之一,其中前三个是在WindowConstantsinterface中定义的(由JFrame
,JInternalPane
和JDialog
实现):
-
DO_NOTHING_ON_CLOSE
- 当用户请求关闭窗口时,不要执行任何操作。相反,该程序可能应使用在其
windowClosing
方法中执行某些其他操作的窗口侦听器。
- 当用户请求关闭窗口时,不要执行任何操作。相反,该程序可能应使用在其
-
HIDE_ON_CLOSE
(JDialog
和JFrame
的默认设置)- 用户关闭窗口时将其隐藏。这会将窗口从屏幕上删除,但使其可显示。
-
DISPOSE_ON_CLOSE
(JInternalFrame
的默认设置)- 当用户关闭窗口时,隐藏并丢弃该窗口。这将从屏幕上删除该窗口并释放它使用的所有资源。
-
EXIT_ON_CLOSE
(在JFrame类中定义)- 使用
System.exit(0)
退出应用程序。仅建议用于应用程序。如果在 applet 中使用,则可能引发SecurityException
。
- 使用
Note:
如果仅显示一个窗口,则DISPOSE_ON_CLOSE
的结果类似于EXIT_ON_CLOSE
。更精确地,当丢弃 Java 虚拟机(VM)中的最后一个可显示窗口时,VM 可以终止。有关详情,请参见AWT 线程问题。
在任何窗口侦听器处理窗口关闭事件之后,将执行默认的关闭操作。因此,例如,假设您指定默认关闭操作是处理框架。您还实现了一个窗口侦听器,该侦听器测试该帧是否为最后一个可见帧,如果是,则保存一些数据并退出应用程序。在这种情况下,当用户关闭框架时,将首先调用窗口侦听器。如果它没有退出应用程序,则将执行默认的关闭操作-放置框架-。
有关处理关闭窗口事件的更多信息,请参见如何编写窗口侦听器。除了处理关闭窗口的事件外,窗口侦听器还可以对其他窗口状态更改(例如图标化和激活)做出反应。
Frame API
下表列出了常用的JFrame
构造函数和方法。您可能要调用的其他方法由java.awt.Frame,java.awt.Window和java.awt.Component类定义,JFrame
从中降级。
因为每个JFrame
对象都有一个根窗格,所以框架支持在框架子项之前插入 Importing 和绘画行为,将子项放置在不同的“层”上以及 Swing 菜单栏。这些主题在使用顶层容器中介绍,并在如何使用根窗格中详细说明。
使用框架的 API 分为以下几类:
方法或构造函数 | Purpose |
---|---|
JFrame() | |
JFrame(String) |
创建最初不可见的框架。 String 参数为框架提供标题。要使框架可见,请在其上调用setVisible(true) 。 |
void setDefaultCloseOperation(int) int getDefaultCloseOperation() |
设置或获取用户按下此框上的关闭按钮时发生的操作。可能的选择是:DO_NOTHING_ON_CLOSE HIDE_ON_CLOSE DISPOSE_ON_CLOSE EXIT_ON_CLOSE 前三个常量在 JFrame 实现的WindowConstantsinterface中定义。 EXIT_ON_CLOSE 常量在JFrame类中定义。 |
void setIconImage(Image) Image getIconImage() (在 Frame 中) |
设置或获取代表框架的图标。请注意,该参数是java.awt.Image对象,而不是javax.swing.ImageIcon (或任何其他javax.swing.Icon 实现)。 |
void setTitle(String) String getTitle() (在 Frame 中) |
设置或获取框架标题。 |
void setUndecorated(boolean) boolean isUndecorated() (在 Frame 中) |
设置或获取是否应装饰该框架。仅当框架尚不可显示(尚未包装或显示)时才有效。通常与全屏独占 Pattern一起使用或启用自定义窗口装饰。 |
静态 void setDefaultLookAndFeelDecorated(boolean) 静态布尔值 isDefaultLookAndFeelDecorated() |
确定随后创建的JFrame 是否应具有当前外观提供的其 Window 装饰(例如边框和用于关闭窗口的小部件)。请注意,这只是一个提示,因为某些外观可能不支持此功能。 |
Method | Purpose | |
---|---|---|
void pack() | ||
(在Window 中) |
调整窗口的大小,以使其所有内容等于或大于其首选大小。 | |
void setSize(int,int) void setSize(Dimension) Dimension getSize() (在 Component 中) |
设置或获取窗口的总大小。 setSize 的整数参数分别指定宽度和高度。 |
|
void setBounds(int,int,int,int) void setBounds(Rectangle) Rectangle getBounds() (在 Component 中) |
设置或获取窗口的大小和位置。对于setBounds 的整数版本,窗口的左上角位于前两个参数指定的* x,y *位置,并具有后两个参数指定的宽度和高度。 |
|
void setLocation(int,int) Point getLocation() (在 Component 中) |
设置或获取窗口左上角的位置。参数分别是* x 和 y *值。 | |
void setLocationRelativeTo(Component) (在 Window 中) |
将窗口定位在中心位置,使其位于指定的组件上方。如果参数为null ,则窗口将居中显示在屏幕上。要使窗口正确居中,应在设置窗口大小后调用此方法。 |
Method | Purpose |
---|---|
void setContentPane(Container) | |
Container getContentPane() |
设置或获取框架内容窗格。内容窗格在框架内包含可见的 GUI 组件。 |
JRootPane createRootPane() void setRootPane(JRootPane) JRootPane getRootPane() |
创建,设置或获取框架根窗格。根窗格 管理 框架的内部,包括内容窗格,玻璃窗格等。 |
void setJMenuBar(JMenuBar) JMenuBar getJMenuBar() |
设置或获取框架菜单栏以 管理 框架的菜单集。 |
void setGlassPane(Component) Component getGlassPane() |
设置或获取框架玻璃窗格。您可以使用玻璃窗格来拦截鼠标事件或在程序 GUI 上方绘画。 |
void setLayeredPane(JLayeredPane) JLayeredPane getLayeredPane() |
设置或获取框架分层窗格。您可以使用框架分层窗格将组件放置在其他组件之上或之下。 |
使用框架的示例
此跟踪中的所有独立应用程序都使用JFrame
。下表列出了一些内容,并告诉您每个内容的讨论位置。
Example | Where Described | Notes |
---|---|---|
FrameDemo | 范例说明 | 显示具有一个组件的基本框架。 |
FrameDemo2 | 指定窗户装饰 | 使您可以创建具有各种窗口装饰的框架。 |
Framework | — | 在创建和销毁窗口,实现菜单栏以及退出应用程序方面的研究。 |
LayeredPaneDemo | 如何使用分层窗格 | 说明如何使用分层窗格(但不使用框架分层窗格)。 |
GlassPaneDemo | 玻璃窗格 | 说明了框架玻璃窗格的使用。 |
MenuDemo | 如何使用菜单 | 显示如何将JMenuBar 放在JFrame 中。 |