我正在为一个项目制作一个国际象棋程序。我正在尝试在棋盘的一侧添加一个移动历史记录框。移动历史运行正常,数据已正确发送到文本区域,但 JTextArea 内的文本在 AI 考虑他的移动时消失了。
public void aiMove(){
if (!playing){ return; }
paintImmediately(0,0,totalX,totalY);
ai = eve.getMove(chess,wtm,aiOut); //text disappears here
chess.makeMove(ai);
wtm = !wtm;
humanMove = true;
writeMove(ai); //updates move history, text reappears here
playing = stillPlaying();
repaint();
}
private void writeMove(Move move){
char c = "abcdefgh".charAt(7-move.fromY);
char h ="abcdefgh".charAt(7-move.toY);
String s = Character.toString(c)+(move.fromX+1)+" - "+Character.toString(h)+(move.toX+1)+" ";
if (!wtm){
String q = chess.getFullMove()+". "+s+" ";
moves.setText(moves.getText()+q);
}
else {
moves.setText(moves.getText()+s+"\n");
}
}
这是正在发生的事情的打印屏幕。 http://s13.postimage.org/mh7hltfk7/JText_Area_disappear.png
已解决 感谢所有回复。我改变了 aiMove() 所以它创建了一个线程。这就是我所做的。
尝试#3 ...摇摆对我来说仍然很陌生。我不想将 writeMove 更改为 getMove,否则我将不得不稍微重写人类的轮到。由于该项目基本上已经完成,我试图避免尽可能多的工作 :) 无论如何,GUI 完全是可选的,我只是为了好玩,并尝试学习一些摇摆。
public void aiMove(){
if (!playing){ return; }
if (!aiThread.isAlive()){
aiThread = new Thread(){
public void run(){
ai = eve.getMove(chess,wtm,aiOut);
chess.makeMove(ai);
wtm = !wtm;
humanMove = true;
SwingUtilities.invokeLater(new Runnable(){
public void run(){
writeMove(ai);
}
});
repaint();
playing = stillPlaying();
}
};
aiThread.start();
}
}
它还解决了我之前遇到的一个问题,如果我按住“a”键(强制 ai 移动),它会排队许多强制 ai 移动。现在这不会发生。