我已经设法创建了一个typewriter类,它在很大程度上完成了我想让它做的事情。它将一次一个字符地输出给它的字符串,在每个字符之间暂停,就像它们是输入的一样,在句号之后暂停更长时间。我现在遇到的问题是,当我使用这个类时,它只起作用一次。当我调用它两次(或更多)时,它会尝试同时运行它们。这会导致重大问题。所以我需要一种方法,让这个类的第一个实例运行,然后每个实例在启动之前等待“轮到它了”。下面是预期结果和当前情况的示例。
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);
}
}
}
}
}当前:
代码:新打字机(“\n nHello”,输出);新打字机(“\n nWorld”,输出);
电流输出
HW ol elr ldo期望输出
Hello
World显然,我省略了Typewriter类中的大部分代码。如果真的需要的话,我可以把它贴出来。可以在here中找到用于ActiveObject的javadoc。这就是我是如何被教导线程的,我担心这可能是问题所在。
编辑:
根据下面的回答,我已经添加了同步(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构造函数。
发布于 2012-01-30 12:38:51
ActiveObject似乎继承了Thread类,并且异步运行,所以您不知道线程什么时候运行。当您创建两个ActiveObject实例时,两个for循环不一定会一个接一个地运行。你看到的结果是你的文本区被2个线程同时更新。
编辑:
您可以使用synchronized子句同步运行代码:
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);
}
}
}发布于 2012-01-30 12:43:18
尽管我最后的答案是javascript,但是理论应该是一样的。为了让case工作,您可能不需要每次都创建一个新对象。您只需要新建一个对象一次,然后每次当您想要将新词放入JTextArea时,您只需调用类中的一个函数来将新字符串附加到" in“字符串。并在类中创建一个time函数,定期输出" in“字符串中的新字符。
如下所示:
导入objectdraw.*;//活动对象的来源。
导入javax.swing.JTextArea;
public class Typewriter extends ActiveObject {
private JTextArea out;
private String in;
private int index;
public Typewriter(String s, JTextArea output) {
in = s;
index = 0;
out = output;
start();
}
public void run() {
while (1) {
if (index < in.length) {
out.append(in.substring(index,index+1));
index++;
}
pause(200);
}
}
public void add_string(String s) {
in += s;
}
}然后你可以调用: Typewriter tw = new Typewriter("Hello");tw.add_string("world");
发布于 2014-02-06 00:18:06
如果你只使用这段代码,这里有一个非常简单的方法,它应该会有帮助。您可以通过更改时间变量(以米尔秒为单位)来加快速度。
import javax.swing.JTextArea;
public class TypeWriter {
private static final long time = 100;
public static void TypeWriterEffect(String s, JTextArea output) {
String[] words = s.split("");
for (String word : words)
{
output.append(word);
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}在另一个类中,您将执行以下操作:
static JTextArea textWindow;
TypeWriter.TypeWriterEffect("This is a Type Writer effect", textWindow);现在不要把我放的变量放进去,这只是为了告诉你要使用什么类型的变量,所以使用你自己的JTextArea变量,你已经添加到你的JFrame或JPanel中了。
希望这能有所帮助:)
https://stackoverflow.com/questions/9059137
复制相似问题