views:

183

answers:

1

I have this action listener:

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();

}

The refreshScreen()s don't seem to work. They are apprently running on the Event Dispatcher thread and the changes made only show up when the action listener's execution is over. It works fine when called from the MokkiGUI() constructor, as it is not on the EDT.

+4  A: 

You are blocking the EDT thread, so it event dispatch loop can't get to the repaint events. Either run outside of the EDT and use java.awt.EventQueue.invokeLater to communicate with the EDT, or use javax.swing.Timer (not java.util!) to regularly run tasks on the EDT.

Tom Hawtin - tackline