Java:基于文本的RPG游戏中的setText GUI代码

时间:2012-02-19 09:40:42

标签: java swing

我目前正在使用简单的GUI制作这个基于文本的RPG游戏。我很高兴找到了良好的开端,但后来我偶然发现了一些让我停止编码的事情。

如果您在控制台中进行此操作,您可以轻松地使用此代码暂停字符的移动一段时间,例如:

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,则会删除旧文本并将其替换为新文本,因此战斗记录将无法完全显示在游戏中。有办法解决这个问题吗?

4 个答案:

答案 0 :(得分:5)

您可以使用append追加而不是替换。这很容易。

困难的部分:你必须改变你的程序流程。在Swing中,存在一个用于调度GUI事件的线程,即事件调度线程。您不应将EDT设置为sleep或在其中执行任何其他长时间运行的操作。这将冻结GUI,它无法响应任何内容,也不会重新绘制。

相反,您应该为逻辑流启动一个新线程,并使用SwingUtilities.invokeLater在EDT(操作GUI的所有内容)上执行必须执行的调度操作,或者在这种情况下可能更好,{{1 }}

或者您应该接受事件驱动的控制流程,例如:您可以使用SwingUtilities.invokeAndWait稍后输出第二个文本。

适用于单线程控制台程序的程序流程不适用于多线程GUI应用程序(并且每个GUI应用程序都是自动多线程的)。

答案 1 :(得分:2)

对于setText部分,你应该有一个保存文本的变量,当你想要添加一个字符串时,你可以附加它并再次设置文本:

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

<强>更新

有些人建议使用相对较好的追加方法。有时在游戏中你想要追加并有时替换整个文本(一个新角色会谈),我会推荐这样的东西:

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

//When someone else wanna talk:

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

答案 2 :(得分:1)

您还可以使用追加()功能。请参阅JavaDoc

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

答案 3 :(得分:1)

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

相关问题