第二个线程在第一次完成之前不会更新gui

时间:2017-12-04 15:05:08

标签: java multithreading swing

我的程序需要一段时间才能启动,因此我想为它创建一个“加载”屏幕(只是一个立即显示的框架,以便用户知道它正在做某事)。这意味着一个框架或JOptoinPane可以立即在一个单独的线程中运行(参见下面的尝试)。延迟在下面的代码中由Thread.sleep(3000)模拟。

问题在于JOptoinPane出现,但在3秒延迟结束之前保持空白,此时它显示为正常。如果将其更改为另一个帧,则行为相同。帧加载但是在时间到期之前是空的

在程序的其余部分执行之前不加载的加载屏幕不是很有用:D。我该如何解决这个问题?

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

public class LoadingTry implements Runnable{

    private JFrame frame;

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    LoadingTry window = new LoadingTry();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }


    Thread thread1 = new Thread () {
        public void run () {
            JOptionPane.showMessageDialog(null, "Intializing...");

        }
    };

    public LoadingTry() {
        thread1.start();

        initialize();
    }


    private void initialize() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {}
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    @Override
    public void run() {}

}

1 个答案:

答案 0 :(得分:0)

想出来。删除部分内容:

EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    LoadingTry window = new LoadingTry();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

将其更改为:

                try {
                    LoadingTry window = new LoadingTry();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
        });

您还可以使用jframe替换JOptionPane并使用有效的静态初始屏幕