2017-04-10 65 views
0

我需要一次将输出显示到JTextArea的一个字符,每个字符之间略有延迟。我尝试如下:Java将打字机效果添加到JTextArea

private static void printInput(final String input) 
{ 
     Timer timer = new Timer(60,new ActionListener(){ 
      public void actionPerformed(ActionEvent e) 
      { 
       for(int i = 0; i<input.length(); i++) 
       { 
        messageArea.append(Character.toString(input.charAt(i))); 
       } 
      } 
     }); 
} 

也有类似的问题,但是我无法找到一个有一个例子,我可以用它来找出我的问题

+0

“定时器”是伪循环,也就是说,每个循环都是循环的迭代,这意味着您需要更新用户界面,更新循环条件并根据需要重复 – MadProgrammer

回答

1

一个Timer是一个伪循环,它是,它在预定义的延迟后触发一个循环,每个循环都是循环的迭代,每次迭代需要更新UI并更新迭代器值。

现在,因为我不喜欢在static上下文中工作,所以我建议的第一件事是将基本概念合并到单独的类中。这样,您就可以轻松地封装状态

public class TypeWriter { 
    private Timer timer; 
    private int characterIndex = 0; 
    private String input; 
    private JTextArea textArea; 

    public TypeWriter(JTextArea textArea, String input) { 
     this.textArea = textArea; 
     this.input = input; 
     timer = new Timer(60, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (characterIndex < input.length()) { 
        textArea.append(Character.toString(input.charAt(characterIndex))); 
        characterIndex++; 
       } else { 
        stop(); 
       } 
      } 
     }); 
    } 

    public void start() { 
     textArea.setText(null); 
     characterIndex = 0; 
     timer.start(); 
    } 

    public void stop() { 
     timer.stop(); 
    } 

} 

所以,这是非常基本的,这一切确实是,使用Timer,检查,看看是否有任何需要打印更多的字符,如果有,它需要下一个字符并将其附加到文本区域并更新迭代器值。如果我们在文本的末尾,它将停止Timer(即退出条件)

+0

非常感谢您的快速响应,并提供了一个工作示例。在开始时,这将文本区域设置为空,我假设这种行为可以安全地排除在外? –

+0

@ BenKramer它将“文本”设置为“null”,是的,当你想清除文本组件时,这是一种常见的做法。你可以用'“”来得到相同的结果。由于文本组件的工作方式,它们将永远不会从'getText'返回'null' – MadProgrammer

+0

我试图在同步关键字下创建两个实例,如下所示: synchronized(messageArea){TypeWriter(messageArea,“Testing”)。开始(); 新TypeWriter(messageArea,“”一开始创建了宇宙,这使得很多人非常愤怒,被广泛认为是一个坏行为。“ - 道格拉斯亚当斯”)。 但是,这并不强迫每个人'等待' –