写在前面:在《软件构造》课程的Lab1中,第一次接触了图像界面,但是图形界面已经为我们设计好了,并不需要我们自己去实现,在Lab3中,实验要求使用图形用户界面或者命令行,博主采用了图形用户界面,博主通过学习java教材,自主完成了图形用户界面的设计,在这里分两次叙述自己对图形用户界面的心得与体会。
一.显示窗体
在Java中,顶层窗口(就是没有包含在其他窗口中的窗口)称为窗体(frame)。AWT库中有一个称为Frame的类,用于描述这个顶层窗口。这个类的Swing版本名为JFrame,它扩展了Frame类。JFrame是极少数几个不绘制在画布上的Swing组件之一。因此,它的修饰部件(按钮、标题栏、图标等)由用户的窗口系统绘制,而不是由Swing绘制。
(1)创建窗体
在这里介绍使用Swing JFrame的最常见方法。下面给出一个显示空窗体的简单程序:
package simpleFrame;
import java.awt.*;
import javax.swing.*;
public class SimpleFrameTest {
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
var frame = new SimpleFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
});
}
}
class SimpleFrame extends JFrame {
private static final int DEFAULT_WIDTH = 300;
private static final int DEFAULT_HEIGHT = 200;
public SimpleFrame() {
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
}
}
下图为该程序执行的结果:
下面来逐行分析这个程序。
Swing类位于javax.swing包中。包名javax表示这是一个java扩展包,而不是核心包。
在默认情况下,窗体的大小为0*0像素,这种窗体没有什么实际意义。这里定义了一个子类SimpleFrame,它的构造器将窗体大小设置为300*200像素。这是SimpleFrame和JFrame之间唯一的差别。
在SimpleFrameTest类的main方法中,我们构造了一个SimpleFrame对象并使它可见。
在每个Swing程序中,有两个技术问题需要强调。
首先,所有的Swing组件必须由事件分派线程配置,这是控制线程,他将鼠标点击和按键等事件传递给用户接口组件。下面的代码用来执行事件分派线程中的语句:
EventQueue.invokeLater(()->
{
statements
});
接下来,定义用户关闭这个窗体的响应动作。对于这个程序而言,我们只是让程序简单地退出。选择这个响应动作的语句是:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
在包含多个窗体的程序中,不能在用户关闭其中的一个窗体时就让程序退出。在默认情况下,用户关闭窗口时只是将窗体隐藏起来,而程序没有终止。
仅仅只是构造窗体,窗体是不会自动显示出来的。窗体起初是不可见的。这就给了程序员一个机会,可以在窗体第一次显示之前向其中添加组件。为了显示窗体,main方法需要调用窗体的setVisible方法。
在初始化语句结束后,main方法退出。需要主义,退出main并没有退出程序,终止的只是主线程,事件分派线程会保持程序处于激活状态,直到关闭窗体或调用System.exit方法终止程序。
下一次博主将介绍窗体的相关属性和显示信息的功能。