Swing GUI下的漫长过程:意外延迟

时间:2016-09-14 07:10:03

标签: java swing swingworker

在这里解释我的问题是MCVE,点击JButton A上的JDialog点击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

2 个答案:

答案 0 :(得分:4)

一个。 SwingWorker在GUI线程上运行。当你让GUI线程休眠时,GUI将完全死亡。

湾是的,使用SwingUtilities.invokeLater()进行长时间运行的任务,并使用SwingWorker#done()将GUI更新任务提交回GUI线程。或者,实现SwingWorker,这是在<div class="form-group"> <label for="name" class="label-head">Company Name <sup><span class="glyphicon glyphicon-asterisk red" aria-hidden="true"></span></sup></label> <input type="text" class="form-control text-box-length input-lg" id="companyname" placeholder="Enter Your Company Name" data-validation="required" maxlength="50"> </div> 任务完成后在GUI线程上运行的便捷方法。

答案 1 :(得分:0)

根据Marko Topolnik的回答和Andrew Thompson的评论,我用Console.Writeline("The account's balance is: " + theAcc.Balance); 来扭曲漫长的过程。
这很好用:

SwingWorker