我已经设法创建了一个打字机类,它能够完成我想要的大部分功能。它会一次输出给它一个字符的字符串,在每个字符之间暂停,就好像它们被键入一样,在句点之后暂停一会儿。我现在遇到的问题是,当我使用这个类时,它只能工作一次。当我将它调用两次(或更多)时,它会尝试同时运行它们。这会导致重大问题。所以我需要一种方法让这个类的第一个实例运行,并且每个在开始之前等待“轮到”。以下是期望的结果和当前的例子。使用JTextArea的打字机效果
import objectdraw.*; // Where active object comes from.
import javax.swing.JTextArea;
public class Typewriter extends ActiveObject {
private JTextArea out;
private String in;
public Typewriter(String s, JTextArea output) {
in = s;
out = output;
start();
}
public void run() {
synchronized(out) {
for(int i=0; i<in.length(); i++) {
out.append(in.substring(i,i+1));
if(in.charAt(i) == '.') {
pause(30);
} else {
pause(200);
}
}
}
}
}
电流:
CODE: 新打字机( “\ nHello”,输出); 新型打字机(“\ nWorld”,输出);
电流输出
HW ol elr ldo
所需的输出
Hello
World
很显然,我省略了大部分的代码从打字机类。如果真的需要我可以发布。 ActiveObject的javadoc可以在here找到。这就是我被教过的线程,我担心这可能是问题所在。
编辑:
每下面我已经添加了同步(OUT)线,但我得到一个NullPointerException当我尝试运行代码的答案。
Exception in thread "main" java.lang.NullPointerException
at objectdraw.ActiveObject.<init>(ActiveObject.java:239)
at com.caldwellysr.TBA.Typewriter.<init>(Typewriter.java:11)
at com.caldwellysr.TBA.Client.initGame(Client.java:78)
at com.caldwellysr.TBA.Client.<init>(Client.java:66)
at com.caldwellysr.TBA.Client.main(Client.java:24)
打字机第11行是构造函数的标题。 客户端行78是我打电话给新的打字机(“测试”,输出);其中输出是JTextArea 客户机行66是对具有打字机的initGame()的调用 客户机行24是JFrame构造函数。
是的,代码是必需的。请张贴它。 – Abbas 2012-01-30 03:55:56
好吧会做... – CaldwellYSR 2012-01-30 03:57:40
听起来像你可能想要使用某种FIFO任务队列。 – 2012-01-30 03:59:51