Java 等待窗口

在Java应用程序中,等待窗口是一种常见的功能,它可以在执行耗时的任务时提供用户友好的界面反馈。等待窗口通常显示一个进度条或旋转的图标,以指示任务的进度,并阻止用户与应用程序进行交互,直到任务完成。本文将介绍如何在Java中实现等待窗口,并提供相应的代码示例。

实现等待窗口的基本思路

要实现等待窗口,我们需要在后台线程中执行耗时的任务,并在前台界面中显示等待窗口。为了防止界面卡死,我们将耗时的任务放在一个单独的线程中执行,这样前台界面可以保持响应。

基本的实现思路如下:

  1. 创建一个新的线程,在该线程中执行耗时的任务。
  2. 在前台界面中显示等待窗口,阻止用户进行交互。
  3. 当耗时任务完成后,关闭等待窗口,恢复用户交互。

下面是一个简单的Java代码示例,演示了如何实现等待窗口的基本思路:

Thread taskThread = new Thread(() -> {
    // 耗时任务的代码逻辑
    // ...
});

taskThread.start();

// 显示等待窗口,阻止用户交互
showWaitDialog();

// 等待耗时任务完成
try {
    taskThread.join();
} catch (InterruptedException e) {
    e.printStackTrace();
}

// 关闭等待窗口,恢复用户交互
closeWaitDialog();

在上面的代码中,我们首先创建了一个新的线程 taskThread,并在其中执行耗时的任务。然后,我们在前台界面中显示等待窗口,并阻止用户的交互。接下来,我们调用 taskThread.join() 方法,等待 taskThread 线程完成任务。最后,我们关闭等待窗口,并恢复用户的交互。

使用 Swing 实现等待窗口

在Java中,可以使用Swing库来实现等待窗口。Swing是用于构建图形用户界面(GUI)的Java库,提供了丰富的组件和布局管理器,可以轻松创建用户友好的界面。

下面是一个使用Swing实现等待窗口的代码示例:

import javax.swing.*;

public class WaitWindowExample {
    private JFrame frame;
    private JDialog waitDialog;

    public WaitWindowExample() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 200);
        frame.setLayout(null);

        JButton button = new JButton("Start Task");
        button.setBounds(100, 50, 100, 30);
        button.addActionListener(e -> startTask());
        frame.add(button);

        waitDialog = new JDialog(frame, "Please wait", Dialog.ModalityType.APPLICATION_MODAL);
        waitDialog.setSize(200, 100);
        waitDialog.setLayout(null);

        JLabel label = new JLabel("Task in progress...");
        label.setBounds(50, 30, 100, 20);
        waitDialog.add(label);

        frame.setVisible(true);
    }

    private void startTask() {
        Thread taskThread = new Thread(() -> {
            // 模拟耗时任务
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            SwingUtilities.invokeLater(() -> {
                waitDialog.dispose(); // 关闭等待窗口
                JOptionPane.showMessageDialog(frame, "Task completed"); // 显示提示对话框
            });
        });

        waitDialog.setVisible(true); // 显示等待窗口
        taskThread.start();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(WaitWindowExample::new);
    }
}

在上面的代码中,我们创建了一个基本的Swing界面,并添加了一个按钮。当用户点击按钮时,会启动一个耗时任务,同时显示一个等待窗口。当耗时任务完成后,我们关闭等待窗口,并显示一个提示对话框。

序列图

下面是上述示例代码的序列图,使用mermaid语法绘制:

sequenceDiagram
    participant User
    participant Frame
    participant Button
    participant TaskThread
    participant WaitDialog
    participant JOptionPane

    User->>+Button: 点击