私はプロジェクトのためにチェスプログラムを作っています。ボードの側面に移動履歴ボックスを追加しようとしています。移動履歴は正常に機能し、データはテキスト領域に適切に送信されますが、AIが移動について考えている間、JTextArea内のテキストは消えます。
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移動がキューに入れられます。今ではそれは起こりません。