我正在製作一個項目的國際象棋程序。我正在嘗試將移動歷史記錄框添加到董事會一方。移動歷史記錄工作正常,數據正確發送到文本區域,但JTextArea內的文本消失,而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力移動),它會排隊迫使許多人工智能移動。現在沒有發生。
運行時間
setText
或至少只代碼在單獨的線程中執行耗時的任務將避免GUI凍結。 –我不確定它是否發生了什麼,但是您應該只使用主線程進行GUI操作,因爲GUI將被此線程刷新。業務邏輯(特別是如果它可能需要一段時間才能完成)應該在一個單獨的線程中。 – SJuan76
您更新的代碼違反了線程規則Swing - *您不應該從除事件分派線程以外的任何線程更新任何UI元素* - 檢查David的答案,因爲他提供了重要的指針,以解決這些問題 – MadProgrammer