系统相关
首页 > 系统相关> > java-Swing GUI下的长进程:意外延迟

java-Swing GUI下的长进程:意外延迟

作者:互联网

为了解释我的问题,这里是一个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

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

解决方法:

一种. showDiag在GUI线程上运行.当您使GUI线程进入睡眠状态时,GUI将完全死机.

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

标签:swingworker,swing,java
来源: https://codeday.me/bug/20191026/1938435.html