我需要一次将输出显示到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)));
                }
            }
        });
}


有类似的问题,但是我找不到一个可以用来解决问题的示例

最佳答案

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(即退出条件)

关于java - Java将打字机效果添加到JTextArea,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43333999/

10-09 00:29