Java将Typewriter效果添加到JTextArea

时间:2017-04-10 22:41:22

标签: java swing timer

我需要一次向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)));
                }
            }
        });
}

有类似的问题,但我找不到一个我可以用来找出问题的例子

1 个答案:

答案 0 :(得分: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(即退出条件)