我目前正在使用简单的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
,则会删除旧文本并将其替换为新文本,因此战斗记录将无法完全显示在游戏中。有办法解决这个问题吗?
答案 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()
会在旧文本的末尾附加新文本。