java - 进程启动时加载消息不会更新

标签 java swing jlabel event-dispatch-thread

我想在进程启动时显示“正在加载消息”,并且想在进程完成时更改消息。我尝试在进程线程启动之前和之后更新 JLabel 中的文本,但问题是框架上只出现最后一次更新。

这是我的代码:

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MyClass extends JFrame {
    private JLabel loading;
    private JButton jButton;
    private JPanel jPanel;

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

    MyClass() {
        jPanel = new JPanel();
        setLayout(new GridLayout(0, 1));
        loading = new JLabel("");
        loading.setVisible(true);

        jButton = new JButton("Click me!");
        addActionToJButon();

        setSize(300, 300);
        jPanel.add(jButton);
        jPanel.add(loading);

        add(jPanel);

        setVisible(true);
    }

    private void addActionToJButon() {
        jButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
            loading.setText("Loading....");
            new Thread(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    for (int i = 0; i <= 1000000; i++) {
                        System.out.println(i);
                    }
                }
            }).start();
            loading.setText("Done!");
            }   
        });
    }
}

我希望在进程启动后出现标签“正在加载...”,并在进程完成时出现消息“完成”,但我不明白为什么框架上会出现带有消息的标签“完成!”。

最佳答案

感谢 JB Nizet 的建议,我使用了 SwingWorker,代码现在可以运行了。

正确的代码如下:

package view;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.ExecutionException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingWorker;

public class MyClass extends JFrame {
    private JLabel loading;
    private JButton jButton;
    private JPanel jPanel;

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

    MyClass() {
        jPanel = new JPanel();
        setLayout(new GridLayout(0, 1));
        loading = new JLabel("");
        loading.setVisible(true);

        jButton = new JButton("Click me!");
        addActionToJButon();

        setSize(300, 300);
        jPanel.add(jButton);
        jPanel.add(loading);

        add(jPanel);

        setVisible(true);
    }

    private void addActionToJButon() {
        jButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                loading.setText("Loading....");

                swingWorker();
            }
        });
    }

    private void swingWorker() {
        SwingWorker worker = new SwingWorker<String, String>() {

            @Override
            protected String doInBackground() throws Exception {
                // TODO Auto-generated method stub
                for (int i = 0; i <= 1000000; i++) {
                    System.out.println(i);
                }
                return "Done";
            }

            protected void done() {
                try {
                    String finished =  get();
                    loading.setText(finished);
                } catch (InterruptedException | ExecutionException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };
        worker.execute();
    }
}

关于java - 进程启动时加载消息不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53971724/

相关文章:

java - Java 中并行流的实用用例有哪些?

java - JFrame setText() 中的 JLabel 问题

java - 我试图在java中绘制正方形,但它不起作用

java - 为什么我的断线不起作用,看起来是对的

java - 如果 JDialog 可见,JLabel 会更改文本

java - if block 中的 if 条件未被检查

java - 我应该如何在 `HttpServletRequest` 中记录发送到 `doPost` 的 `HttpServlet` 以供以后播放?

java - 如何更改两个字符串之间的字符?

java - 显示用户名

java - 如何在JLabel中输出变量