2016-10-21 1 views
0

Comme le titre dit, je veux ajouter à mots d'exécution à l'intérieur JTextArea, je simplement écrit ceci:Ajouter des mots au hasard à l'intérieur de l'exécution JTextArea sans l'aide du clavier

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(); 
      } 
     }); 
    } 
} 

mais il ne fonctionne pas. Le while(true) ne permet pas de montrer quoi que ce soit. Quelqu'un peut m'expliquer pourquoi?

Répondre

1

Vous devez utiliser une minuterie n'atteindre cet objectif. essayez ceci:

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

Cela ne permet pas d'afficher quoi que ce soit, car le thread supposé initier une boucle ne fait que boucle dans la boucle while, il ne peut donc plus effectuer d'initialisation.

Vous devez commencer un fil dans insertRandomLetterInsideJtextArea, comme ceci:

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(); 
    }