我正在写一个Reversi应用程序。我实现了转换管理器类,但我在while循环中遇到了一些问题。
这是我的代码:
while (!table.isFull() || passFlag != 2) {
if (player1.isActive()) {
for (int i = 0; i < table.getSize(); i++) {
for (int j = 0; j < table.getSize(); j++) {
table.getField(i, j).addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getSource() instanceof Field) {
((Field) e.getSource()).changeToBlack();
}
}
});
}
}
}
if (player2.isActive()) {
for (int i = 0; i < table.getSize(); i++) {
for (int j = 0; j < table.getSize(); j++) {
table.getField(i, j).addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getSource() instanceof Field) {
((Field) e.getSource()).changeToWhite();
}
}
});
}
}
}
sentinel.changeActivePlayer(player1, player2);
该表是按钮网格,字段是按钮。循环不等待玩家互动。如何实现代码以便等待用户单击鼠标?
这是此类的完整代码
package Core;
import GUILayer.Field;
import GUILayer.MainFrame;
import elements.Player;
import elements.Table;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TurnManager {
int passFlag = 0;
int TurnFlag = 0;
Sentinel sentinel = new Sentinel();
public TurnManager() {
}
public void manage(MainFrame mainframe, Table table, Player player1, Player player2) {
while (!table.isFull() || passFlag != 2) {
if (player1.isActive()) {
for (int i = 0; i < table.getSize(); i++) {
for (int j = 0; j < table.getSize(); j++) {
table.getField(i, j).addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getSource() instanceof Field) {
((Field) e.getSource()).changeToBlack();
}
}
});
}
}
}
if (player2.isActive()) {
for (int i = 0; i < table.getSize(); i++) {
for (int j = 0; j < table.getSize(); j++) {
table.getField(i, j).addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getSource() instanceof Field) {
((Field) e.getSource()).changeToWhite();
}
}
});
}
}
}
sentinel.changeActivePlayer(player1, player2);
}
}
}
答案 0 :(得分:4)
我同意霍华德评论......这看起来非常错误。使用侦听器和事件意味着您(大多数时候)不必自己使用事件循环。
尝试以下操作:创建一个包含您的电路板的类。董事会知道每个领域的颜色(以及它需要知道的其他一切)。初始化GUI时,创建单个 EventListener,调用板对象的某些方法。这个方法被传递了被点击的字段(我想它被点击了,或者我错了?)。您将此EventListener的引用存储在变量中。然后循环遍历每个for和column,并将此侦听器附加到每个字段。然后显示GUI。
让我澄清一下:所有这些都是在初始化时完成的。
答案 1 :(得分:0)
一些建议:
答案 2 :(得分:0)
这不是一个完整的解决方案,但您的代码看起来应该更像这样。我认为将这些东西放在一起是一个很好的起点。希望这会有所帮助。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TurnManager implements ActionListener{
int passFlag = 0;
int TurnFlag = 0;
Sentinel sentinel = new Sentinel();
Player player1,player2;
public TurnManager(MainFrame mainframe, Table table, Player p1, Player p2) {
player1 = p1;
player2 = p2;
for (int i = 0; i < table.getSize(); i++) {
for (int j = 0; j < table.getSize(); j++) {
table.getField(i, j).addActionListener(this);
}
}
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() instanceof Field) {
Field field = ((Field) e.getSource());
//implement logic here, for example:
if (table.isFull())
throw new RuntimeException("Table full! Stop! STOP!");
if (player1.isActive())
field.changeToBlack();
if (player2.isActive())
field.changeToBlack();
}
}
}