2012-02-19 96 views
4

我目前正在用一個簡單的GUI製作這個基於文本的RPG遊戲。我很高興能找到一個好的開始,但是之後我發現了一些讓我停止編碼一段時間的事情。Java:setText在基於文本的RPG遊戲中的GUI代碼

如果您正在這個控制檯,您可以輕鬆地使用此代碼暫停字符的運動一會兒,比如:

System.out.println("[enemy]"); 
Thread.sleep(1000); 
System.out.println("The local guard waves his sword and tries to stab you in the back, but you quickly parried and tried for a counterattack but you failed."); 

如果您是在JTextArea這樣做,你會使用setText但是 如果您使用Thread.sleep它不起作用並且再次編碼setText,則會擦除舊文本並將其替換爲新文本,因此戰鬥的記錄將不會完全顯示在遊戲中。有沒有辦法來解決這個問題?

+0

你可以請一個答案! – 2012-02-25 12:01:57

+0

我該怎麼做?它沒有任何投票的答案? – ElvenX 2012-02-26 09:33:50

+0

你喜歡的答案,你只需點擊旁邊的綠色勾號 – 2012-02-26 11:51:07

回答

2

爲的setText的一部分,你應該有一個變量,它保存的文本,當你想添加一個字符串,你追加並重新設置文本:

String text ="[enemy]"; 
textfield.setText(text); 
text+= "\nblablabla .."; 
textfield.setText(text); 

UPDATE:

有些人建議使用相對較好的append方法。有時在遊戲中你想追加,有時替換整個文本(一個新的角色會談),我建議是這樣的:

textfield.setText("[enemy]\n"); 
textfield.append("blablabla"); 

//When someone else wanna talk: 

thread.Sleep(1000); 
textfield.setText("[me]\n"); 
textfield.append("moreblablabla"); 
+0

我明白了,我現在就試試,謝謝先生阿德爾:) – ElvenX 2012-02-19 09:51:06

+0

@JanraeMendoza看到我的更新 – 2012-02-19 10:39:02

1

您也可以使用的append()功能。見JavaDoc

jTextField.append("Foo\n"); 
jTextField.append("Bar\n"); 
1

可以使用append()代替setText()。方法append()將在舊文本的末尾附加新文本。

5

您可以使用append來代替替換。這是很容易的部分。

困難的部分:你必須改變你的程序流程。在Swing中,存在用於調度GUI事件的單個線程,即事件調度線程。您不應將EDT設置爲sleep或在其中執行任何其他長時間運行的操作。這會凍結GUI,它無法響應任何內容,也不會重新繪製。

相反,您應該爲SwingUtilities.invokeLater或在此情況下可能更好的SwingUtilities.invokeAndWait啓動一個新的線程,用於必須在EDT上執行的邏輯流和調度操作(操縱GUI的所有操作)。或者你應該接受一個事件驅動的控制流程,例如,您可以使用Timer稍後輸出第二個文本。

對於多線程GUI應用程序(每個GUI應用程序都是自動多線程的),與單線程控制檯程序配合使用的程序流程不是正確的方法。

+1

+ 1爲解決'困難的部分'。 – 2012-02-19 11:00:27