2012-02-19 99 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