Поскольку вы кодируете Swing, не выполняйте циклы while (true)
, поскольку вы заблокируете поток событий, EDT.Вместо этого вам следует либо использовать Swing Timer, либо, что более вероятно, в вашем случае, так как я предполагаю, что вы играете в пошаговую игру (пожалуйста, исправьте меня, если ошибаюсь), чтобы действия зависели от событий.С последним, вместо замены ActionListeners, вы просто изменили бы состояние программы через одно поле и изменили поведение ActionListener в зависимости от этого состояния.
Для примера последнего см. Код ниже.Состояние программы поддерживается переменной playerIndex int:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class ToggleGame extends JPanel {
public static final String[] PLAYERS = {"Player 1", "Player 2"};
// turnIndex is either 0 or 1, depending on whose turn it is.
private int turnIndex = 0;
private JButton turnButton = new JButton(PLAYERS[turnIndex]);
public ToggleGame() {
add(new JLabel("Turn:"));
add(turnButton);
setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
turnButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
turnBtnAction(evt);
}
});
}
private void turnBtnAction(ActionEvent evt) {
turnIndex++; // next player
turnIndex %= PLAYERS.length; // mod 2
turnButton.setText(PLAYERS[turnIndex]);
doSomething(turnIndex);
}
private void doSomething(int index) {
String msg = "It is now " + PLAYERS[index] + "'s turn!";
String title = "Whose Turn Is It?";
JOptionPane.showMessageDialog(this, msg , title, JOptionPane.INFORMATION_MESSAGE);
}
private static void createAndShowGui() {
ToggleGame mainPanel = new ToggleGame();
JFrame frame = new JFrame("ToggleGame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}