JFrame ActionPerformed на кнопке занимает все время, пока код не завершится - PullRequest
0 голосов
/ 10 июля 2020

Я впервые делаю GUI на java, и у меня есть небольшая проблема, которая довольно раздражает.

Мой код выглядит примерно так.

private void RunButtonActionPerformed(java.awt.event.ActionEvent evt){
    richText.append("Starting...");
    try{ something happens here }
    richText.append("Done...");
}

проблема в том, что когда я нажимаю кнопку «Выполнить», он ждет, пока не завершит задачу, и одновременно напечатает «Запуск ...» и «Готово ...». Как сделать так, чтобы он печатал сначала «Запуск», а «Готово» после?

Ответы [ 2 ]

0 голосов
/ 16 июля 2020

Я следил за руководством по SwingWorker, как было предложено в комментарии, и он работал! Это выглядит примерно так.

`private class Worker extends SwingWorker<Void, Void>{
    protected Void doInBackground() throws Exception{
        try{ things happen here }
        return null;
    }
    @Override
    protected void done(){
        try{ get (); } catch (){}
    }
}

И чтобы вызвать это, RunButtonActionPerformed просто нужно new Worker().execute().

0 голосов
/ 16 июля 2020

Этот код выполняется в EDT, поэтому любые изменения пользовательского интерфейса (richText.append в вашем случае) будут перерисованы после него. Вы должны выполнить свою тяжелую задачу в новом потоке.

private void RunButtonActionPerformed(java.awt.event.ActionEvent evt){
    richText.append("Starting...");
    new Thread() {
        public void run() {
            try{ something happens here }
            SwingUtilities.invokeLater(new Runnable() {
                richText.append("Done...");
            });
        }
    }.start();
    
}

Или используйте SwingWorker, чтобы получить дополнительные функции, такие как отчет о ходе выполнения задачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...