Сообщение о загрузке не обновляется при запуске процесса - PullRequest
0 голосов
/ 29 декабря 2018

Я хочу отобразить «сообщение о загрузке», когда процесс запущен, и я хочу изменить сообщение, когда процесс завершен.Я пытался обновить текст с 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!");
            }   
        });
    }
}

Я ожидал, что появится метка «Загрузка ...» после начала процесса и сообщение «Готово», когда процесс завершится, но я не могу понять, почему на фрейме появляется метка ссообщение «Готово!».

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Благодаря советам 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();
    }
}
0 голосов
/ 29 декабря 2018

Поскольку вы выполняете «загрузку» внутри потока и задаете загрузочный текст вне потока, вы сразу же устанавливаете загрузку на «Готово!»когда вы начинаете загрузку.То, что вы хотите сделать, это установить загрузку в вашей функции run () следующим образом:

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

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub

        new Thread(new Runnable() {

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