如何制作框架(主窗口)

框架是带有标题和边框的顶级窗口。边框的大小包括为边框指定的任何区域。可以使用getInsets方法获得边界区域的尺寸。由于边框区域包括在框架的整体大小中,因此边框有效地遮盖了框架的一部分,从而限制了可用于渲染和/或显示子组件的区域到左上角位置为(insets.leftinsets.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的替代方法是通过调用setSizesetBounds(这也会设置帧位置)显式构建帧大小。通常,使用pack比调用setSize更可取,因为pack让框架布局 管理 器负责框架大小,并且布局 管理 器擅 Long 适应平台依赖性和影响组件大小的其他因素。

本示例未设置框架位置,但是使用setLocationRelativeTosetLocation方法很容易做到。例如,以下代码在屏幕上居中显示框架:

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中定义的(由JFrameJInternalPaneJDialog实现):

  • DO_NOTHING_ON_CLOSE

    • 当用户请求关闭窗口时,不要执行任何操作。相反,该程序可能应使用在其windowClosing方法中执行某些其他操作的窗口侦听器。
  • HIDE_ON_CLOSE(JDialogJFrame的默认设置)

    • 用户关闭窗口时将其隐藏。这会将窗口从屏幕上删除,但使其可显示。
  • 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.Framejava.awt.Windowjava.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 装饰(例如边框和用于关闭窗口的小部件)。请注意,这只是一个提示,因为某些外观可能不支持此功能。

设定 Windows 大小和位置

MethodPurpose
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,则窗口将居中显示在屏幕上。要使窗口正确居中,应在设置窗口大小后调用此方法。

与根窗格相关的方法

MethodPurpose
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。下表列出了一些内容,并告诉您每个内容的讨论位置。

ExampleWhere DescribedNotes
FrameDemo范例说明显示具有一个组件的基本框架。
FrameDemo2指定窗户装饰使您可以创建具有各种窗口装饰的框架。
Framework在创建和销毁窗口,实现菜单栏以及退出应用程序方面的研究。
LayeredPaneDemo如何使用分层窗格说明如何使用分层窗格(但不使用框架分层窗格)。
GlassPaneDemo玻璃窗格说明了框架玻璃窗格的使用。
MenuDemo如何使用菜单显示如何将JMenuBar放在JFrame中。