2010-04-20 3 views
0

У меня есть это действие слушателя:Проблема получения Качели, чтобы обновить JLabel (видимо, на событие отправки нити)

this.newGameButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent a) { 
    MokkiGUI.this.game = newGameQuery(); 
    MokkiGUI.this.AI = new AIPlayer(MokkiGUI.this.game.getBoard()); 
    MokkiGUI.this.boardLabel.setText(""); 
    MokkiGUI.this.boardLabel.repaint(); 
    refreshScreen(); 
    JOptionPane.showMessageDialog(null, "Starting new game", "New game", JOptionPane.PLAIN_MESSAGE); 
    if (MokkiGUI.this.game.getAIIndicator() % 2 == 1) { 
     while (makeAIMove()) { 
     MokkiGUI.this.refreshScreen(); 
     } 
     MokkiGUI.this.refreshScreen(); 
    } 
    } 
}); 

public void refreshScreen() { 
if (javax.swing.SwingUtilities.isEventDispatchThread()) { 
    System.out.println("Is"); 
} else { 
    System.out.println("Not"); 
} 
MokkiGUI.this.boardLabel.setText(MokkiTest.printBoard(MokkiGUI.this.game.getBoard())); 
MokkiGUI.this.boardLabel.repaint(); 
MokkiGUI.this.data.setText("X: " + MokkiGUI.this.game.getPlayer1name() + "\n Score: " 
    + MokkiGUI.this.game.getPlayer1score() + "\n\n" + "O: " + MokkiGUI.this.game.getPlayer2name() + "\n Score: " 
    + MokkiGUI.this.game.getPlayer2score()); 
MokkiGUI.this.data.repaint(); 
if (!MokkiGUI.this.game.redoable()) { 
    MokkiGUI.this.forwardButton.setEnabled(false); 
    MokkiGUI.this.allForwardButton.setEnabled(false); 
} else { 
    MokkiGUI.this.forwardButton.setEnabled(true); 
    MokkiGUI.this.allForwardButton.setEnabled(true); 
} 
if (!MokkiGUI.this.game.undoable()) { 
    MokkiGUI.this.backButton.setEnabled(false); 
    MokkiGUI.this.allBackButton.setEnabled(false); 
} else { 
    MokkiGUI.this.backButton.setEnabled(true); 
    MokkiGUI.this.allBackButton.setEnabled(true); 
} 
MokkiGUI.this.buttonPanel.repaint(); 

}

refreshScreen() s не похоже на работу. Они, вероятно, работают в потоке Диспетчера событий, и внесенные изменения появляются только при завершении выполнения исполнителем действия. Он отлично работает при вызове из конструктора MokkiGUI(), поскольку он не находится на EDT.

ответ

4

Вы блокируете поток EDT, поэтому цикл отправки события не может попасть в события перерисовки. Либо работайте за пределами EDT, либо используйте java.awt.EventQueue.invokeLater для связи с EDT или используйте javax.swing.Timer (не java.util!) Для регулярного запуска задач на EDT.