Как немедленно изменить текст jLabel внутри обработчика MouseEvent? - PullRequest
3 голосов
/ 22 мая 2011

У меня проблема с обновлением компонентов свинга внутри обработчика событий действия мыши. Проблема в том, что все jLabels, которые изменены в этой функции, их изменения видны после того, как jButton1MouseClicked () сделан. Вот моя функция:

private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {                                      

    int cycles = Integer.parseInt(c.settings.get("cycles"));
    statusMessageLabel.setText("Data collection in progress...");

    for(int i=1;i <= Integer.parseInt(c.settings.get("cycles"));i++) {

        jLabelCycle.setText(Integer.toString(i));

        //here are some functions which are implementing data collection


        if(i < cycles){
            int counter = Integer.parseInt(c.settings.get("interval"));
            while(counter >= 0){
                jLabelTimer.setText(Integer.toString(counter));
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                    Logger.getLogger(AppCView.class.getName()).log(Level.SEVERE, null, ex);
                }
                counter--;
            }
        }

    }
    statusMessageLabel.setText("Data collection has been finished.");
}    

Можете ли вы помочь мне? Мне действительно нужно, чтобы эти изменения были видны непосредственно, потому что один jLabel визуализирует счет до следующего цикла, а второй визуализирует фактический номер цикла. Я попытался вызвать функцию repaint () на всех jLabels после того, как я изменил их, но это не помогло.

Спасибо всем за любую помощь.

1 Ответ

6 голосов
/ 22 мая 2011

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

Я предлагаю переписать ваш код, чтобы использовать javax.swing.Timer вместо Thread.sleep.

Как правило, длительные операции должны выполняться в отдельном потоке.Любые операции, связанные с компонентами AWT или Swing, должны быть поставлены в очередь для запуска на AWT EDT с использованием java.awt.EventQueue.invokeLater.

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