首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JTextArea的打字机效果

JTextArea的打字机效果
EN

Stack Overflow用户
提问于 2012-01-30 11:52:20
回答 3查看 2K关注 0票数 4

我已经设法创建了一个typewriter类,它在很大程度上完成了我想让它做的事情。它将一次一个字符地输出给它的字符串,在每个字符之间暂停,就像它们是输入的一样,在句号之后暂停更长时间。我现在遇到的问题是,当我使用这个类时,它只起作用一次。当我调用它两次(或更多)时,它会尝试同时运行它们。这会导致重大问题。所以我需要一种方法,让这个类的第一个实例运行,然后每个实例在启动之前等待“轮到它了”。下面是预期结果和当前情况的示例。

代码语言:javascript
复制
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”,输出);

电流输出

代码语言:javascript
复制
HW ol elr ldo

期望输出

代码语言:javascript
复制
Hello
World

显然,我省略了Typewriter类中的大部分代码。如果真的需要的话,我可以把它贴出来。可以在here中找到用于ActiveObject的javadoc。这就是我是如何被教导线程的,我担心这可能是问题所在。

编辑:

根据下面的回答,我已经添加了同步(Out)行,但是当我尝试运行代码时,我得到了一个nullpointerexception。

代码语言:javascript
复制
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构造函数。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-30 12:38:51

ActiveObject似乎继承了Thread类,并且异步运行,所以您不知道线程什么时候运行。当您创建两个ActiveObject实例时,两个for循环不一定会一个接一个地运行。你看到的结果是你的文本区被2个线程同时更新。

编辑:

您可以使用synchronized子句同步运行代码:

代码语言:javascript
复制
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);
        }
    }      
}
票数 3
EN

Stack Overflow用户

发布于 2012-01-30 12:43:18

尽管我最后的答案是javascript,但是理论应该是一样的。为了让case工作,您可能不需要每次都创建一个新对象。您只需要新建一个对象一次,然后每次当您想要将新词放入JTextArea时,您只需调用类中的一个函数来将新字符串附加到" in“字符串。并在类中创建一个time函数,定期输出" in“字符串中的新字符。

如下所示:

导入objectdraw.*;//活动对象的来源。

导入javax.swing.JTextArea;

代码语言:javascript
复制
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");

票数 1
EN

Stack Overflow用户

发布于 2014-02-06 00:18:06

如果你只使用这段代码,这里有一个非常简单的方法,它应该会有帮助。您可以通过更改时间变量(以米尔秒为单位)来加快速度。

代码语言:javascript
复制
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();
    }
   }  
  }
 }

在另一个类中,您将执行以下操作:

代码语言:javascript
复制
 static JTextArea textWindow;
 TypeWriter.TypeWriterEffect("This is a Type Writer effect", textWindow);

现在不要把我放的变量放进去,这只是为了告诉你要使用什么类型的变量,所以使用你自己的JTextArea变量,你已经添加到你的JFrame或JPanel中了。

希望这能有所帮助:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9059137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档