java - Swing GUI下的长进程 : unexpected delay

标签 java swing swingworker

在这里解释我的问题是一个 MCVE,其中单击 JDialog A 上的 JButton 打开 JDialog B:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;

public class  DiagA extends JDialog  {

    private DiagB diag;

    public  DiagA() {

        super();
        setTitle("main diag");
        setSize(200, 150);
        setLocation(400,400);

        JButton btn = new JButton("Show DiagB");
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {

                showDiag();
            }
        });
        add(btn, BorderLayout.NORTH);

        //make main frame visible
        setVisible(true);
    }

    void showDiag() {

        if(diag == null) {

            diag = new DiagB();

            //this prints out as expected
            System.out.println("set visible done");

            try {
                Thread.sleep(3000);
            } catch (InterruptedException ex) {}

            //only after the delay diag shows in full
        }
    }

    public static void main(String[] args) {
        new  DiagA();
    }
}

class DiagB extends JDialog  {

    public  DiagB() {

        super();
        setTitle("2nd diag");
        setSize(150, 100);
        setLocation(600,420);
        setLayout(new FlowLayout(FlowLayout.CENTER));
        getContentPane().setBackground(Color.YELLOW);
        setVisible(true);
    }
}

正如您在代码中看到的,我在创建 DiagB 后添加了 3 秒的延迟。 单击按钮 DiagB 显示如下:

enter image description here

只有在 3 秒延迟结束后,DiagB才会完整显示:

enter image description here

我的问题是:
一个。为什么 DiagB 构建后没有完全显示? (它仅在 showDiag() 返回时完整显示)。
乙。我提出问题的原因是 DiagB 需要通过 DiagA 中的长进程进行更新。
什么是正确的更新方式?是否需要为每个更新过程使用 SwingWorker

最佳答案

一个。 showDiag 在 GUI 线程上运行。当您让 GUI 线程 hibernate 时,GUI 将完全停止运行。

是的,将 SwingWorker 用于长时间运行的任务,并使用 SwingUtilities.invokeLater() 将 GUI 更新任务提交回 GUI 线程。或者,实现 SwingWorker#done(),这是一种在 SwingWorker 任务完成后在 GUI 线程上运行的便捷方法。

关于java - Swing GUI下的长进程 : unexpected delay,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39484450/

相关文章:

java - 如何在 Java 中显示部分 HTML 文档

java - 调用SwingWorker run是否有错误以及如何同步doInBackground?

java - 处理文件的小程序在本地工作但在网站上失败

java - java备用备份轮换算法

java - 带有 spring 数据的 mongodb 查询键值

c# - C# 4.0 中的协变和逆变推理

Java - SwingWorker - 如何在 EDT 中使用发布的数组列表

java - 如何使用jface在列表中搜索所需元素

java - 使用几个曲线球在 Swing JTextArea 上强制执行最大字符数

java - 如何使用 MouseListener 和 MouseMotionListener 进行绘制