2017-04-10 68 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,「」一開始創建了宇宙,這使得很多人非常憤怒,被廣泛認爲是一個壞行爲。「 - 道格拉斯亞當斯」)。 但是,這並不強迫每個人'等待' –