2016-10-21 9 views
0

を使用せずにJTextAreaに内部の実行時にランダムな単語を追加、私は単純に、この書いた:タイトルが言ったように私はJTextAreaの内部ランタイム言葉で追加したい、キーボード

import java.awt.*; 
import javax.swing.*; 

public class Test extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private JTextArea tarea; 

    public Test() { 
     tarea = new JTextArea(10, 10); 
    } 

    private void init() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     insertRandomLetterInsideJtextArea(); 
     JScrollPane scroll = new JScrollPane(tarea); 
     getContentPane().add(scroll, BorderLayout.CENTER); 
     pack(); 
     setLocationByPlatform(true); 
     setVisible(true); 
    } 

    private void insertRandomLetterInsideJtextArea() { 
     while (true) { 
      tarea.setText("foo\n"); 
     } 
    } 

    public static void main(String... args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new Test().init(); 
      } 
     }); 
    } 
} 

を、それは動作しません。 while(true)は何も表示できません。 なぜ誰かが私に説明できますか?

答えて

1

あなたはタイマーを使用する必要があり、これを達成します。 試着:

package test; 

import java.awt.BorderLayout; 
import java.util.Timer; 
import java.util.TimerTask; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 

public class Test extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private JTextArea tarea; 

    public Test() { 
     tarea = new JTextArea(10, 10); 
    } 

    private void init() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JScrollPane scroll = new JScrollPane(tarea); 
     getContentPane().add(scroll, BorderLayout.CENTER); 
     pack(); 
     setLocationByPlatform(true); 
     setVisible(true); 
     insertRandomLetterInsideJtextArea(); 
    } 

    private void insertRandomLetterInsideJtextArea() { 

     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(new TimerTask() { 
      String content = ""; 
      @Override 
      public void run() { 
       content += "foo\n"; // here generate your random String 
       tarea.setText(content); 
      } 
     }, 100, 1000); // firt is time before start, second is duration before repeat task, both in ms 

    } 

    public static void main(String... args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new Test().init(); 
      } 
     }); 
    } 
} 
1

何も表示することは許可されていません。なぜなら、initを実行するはずのスレッドはwhileループで永遠にループするだけなので、それ以上の初期化はできません。

あなたはこのように、insertRandomLetterInsideJtextAreaでスレッドを開始する必要があります。

private void insertRandomLetterInsideJtextArea() { 
     new Thread() { 
      Random r = new Random(); 
      public void run() { 
       while (true) { 
       try { 
        sleep(1000); // to not kill your app wait a little bit before adding next letter. 
        char c = (char) (r.nextInt(26) + 'a'); 
        tarea.setText(tarea.getText() + c);    
       } catch (Exception e) {} 
       } 
      } 
     }.start(); 
    } 
関連する問題