Java - Swing JLabel обновляется слишком быстро? - PullRequest
1 голос
/ 29 ноября 2011

В методе класса я обновляю одну и ту же метку дважды. В первый раз, это показывает пользовательское сообщение, чтобы ждать, но во второй раз показывает пользователю законченное сообщение. Примерно так:

MyClass{

    myMethod(){

        jLabel.setText("Please wait...");

        //does calculation

        jLabel.setText("Completed successfully!");

        }
}

Когда я запускаю приложение, я вижу только сообщение «Успешно завершено». JLabel обновляется слишком быстро? Как мне это контролировать? Я попытался использовать следующее, но не повезло: (

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                 jLabel.setText("Please wait...");
            }
        });

Ответы [ 3 ]

6 голосов
/ 29 ноября 2011

Если расчет выполняется в потоке диспетчеризации событий, он блокирует поток и не позволяет ему выполнять все перерисовки.Вы должны выполнить вычисления в другом потоке, и этот поток должен изменить текст метки по его окончании (в потоке отправки событий, используя SwingUtilities.invokeLater или используя механизм SwingWorker).Если вычисление действительно быстрое, оно того не стоит, потому что второй текст будет появляться так быстро после первого, что вы даже не заметите первый.

Посмотрите на SwingWorker, которыйпредназначен для таких случаев использования. Его Javadoc содержит полезный пример.

3 голосов
/ 29 ноября 2011

, если вы хотите отложить какое-либо действие / событие, тогда используйте javax.swing.Timer или поместите код в уведомление Runnable#Thread,

: никогда не используйте Thread.sleep(int) во времяEDT, ваш графический пользовательский интерфейс замораживается до тех пор, пока Thread.sleep(int) не закончится

пример для javax.swing.Timer & Runnable#Thread & Freeze GUI от Thread.sleep(int) во время EDT здесь

0 голосов
/ 29 ноября 2011

Возможно, потому что ваши вычисления происходят слишком быстро. Вы пытались выставить задержку после расчета?

Также, как указывает Nizet выше, если это происходит в EDT, компонент не будет перекрашиваться до конца потока, что означает, что он примет последнее установленное значение.

...