跳转至

a. Swing基础

a. Swing基础

更新日期: 2021-01-07


1. 概述

Swing包是Java基础包中提供GUI相关功能的包。是为了编写桌面窗口程序而设计的,但是目前被使用的不多。Oracle已经不再对Swing进行更新,Swing将逐渐走向消亡。

如果要学习使用Java编写桌面窗口程序,现阶段JavaFx是更好的选择,也是Java未来的发展方向。

编写此篇文档时,写窗口程序主要为了写游戏。并未使用太多窗口、文本标签、按钮之类的东西。所以仍然使用Swing。

本节包含哪些内容呢?

  • 创建一个简单的窗口
  • 窗口的基本设定
  • 正确执行创建和显示窗口的代码
  • 自定义窗口外观

2. 创建一个简单的窗口

在Swing中,一个JFrame对象就对应一个窗口。因此要创建一个简单的窗口,只需要简单的几步:

  • 创建一个JFrame对象
  • 初始化JFrame对象
  • 显示窗口

我们直接看代码实例:

创建一个简单的窗口

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
public static void main( String[] args )
{
    System.out.println( "Hello World!" );
    // 创建JFrame对象
    JFrame jFrame = new JFrame();
    // 设定一个大小,以便于我们确认窗口的正确显示
    jFrame.setPreferredSize(new Dimension(800, 600));
    // 显示窗口
    jFrame.setVisible(true);
}

显示效果如下:

Window

3. 窗口的基本设定

在上一小节中,我们设定了窗口的大小。除了大小之后还有一些常用的属性。还是直接看代码。

窗口的基本设定

1
2
3
4
5
6
// 窗口关闭时退出程序
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 自动调整窗口(窗口和窗口中的各元素)
jFrame.pack();
// 最大化显示
jFrame.setExtendedState(jFrame.getExtendedState() | JFrame.MAXIMIZED_BOTH);

这些属性的作用都显而易见。再次运行程序,窗口则直接以最大化显示。关闭窗口时,整个Java程序也会跟着退出。

这些几乎是必须设定的属性。

4. 正确执行创建和显示窗口的代码

上面的代码可以正确的显示窗口,看起来也没有什么问题。但是一般而言我们应该使用如下的代码来执行创建和显示窗口的代码。

正确执行创建和显示窗口的代码

1
2
3
4
5
6
7
EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
        // 创建并显示窗口
        displayWindow();
    }
});

这涉及到Java中GUI处理线程。通常的解释是不这样用的话,如果在main函数的后续处理中进行耗时的运算代码,可能导致GUI被卡住。

5. 自定义窗口外观

Java默认的窗口外观,被公认为很丑,很不现代化。使用自定义的窗口外观可以稍微的缓解这个问题。

从网上我们可以找到很多别人已经写好的窗口外观组件,窗口外观英文叫做Look And Feel,搜索这个词可以找到很多。

比如我找到了这个: - FlatLaf - Flat Look and Feel

使用方法很简单,只需要在Maven中加入对应的jar包,然后在main函数中创建JFrame以前设定好这个外观。

Maven中加入此组件的jar包

1
2
3
4
5
6
7
<!-- https://mvnrepository.com/artifact/com.formdev/flatlaf -->
<dependency>
    <groupId>com.formdev</groupId>
    <artifactId>flatlaf</artifactId>
    <version>0.46</version>
    <scope>runtime</scope>
</dependency>

这里我设定一个暗色的外观:

在程序中设定窗口外观

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
// 设定窗口外观
try {
    UIManager.setLookAndFeel(new FlatDarculaLaf());
} catch (UnsupportedLookAndFeelException e) {
    e.printStackTrace();
}

EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
        // 创建并显示窗口
        displayWindow();
    }
});

运行效果如下:

Window

如果窗口里有各种控件的话,具体的效果如下图:

Window

6. 总结

这里我们简单的介绍了一下Swing的基础,可以说是窗口程序的Hello World。 后面的其他文档里会做进一步的介绍。