web-dev-qa-db-fra.com

Actualiser dynamiquement JTextArea lors du traitement?

J'essaie de créer une interface utilisateur Swing très simple qui enregistre des informations à l'écran via un JTextArea, le traitement ayant lieu en arrière-plan. Lorsque l'utilisateur clique sur un bouton, je souhaite que chaque appel:

textArea.append(someString + "\n");

à afficher immédiatement dans l'interface utilisateur.

Pour le moment, JTextArea n'affiche pas toutes les informations du journal avant la fin du traitement après avoir cliqué sur le bouton. Comment puis-je l'obtenir pour actualiser dynamiquement?

23
digiarnie

J'ai rencontré le même problème avec ma demande. J'avais un bouton "Exécuter" de mon application qui effectuait certaines actions et exportait les résultats vers un JTextArea. J'ai dû appeler la méthode à partir d'un thread. Voici ce que j'ai fait.

J'ai plusieurs boutons radio d'actions qui peuvent être effectués, puis un bouton "Exécuter" pour exécuter cette action particulière. J'ai une action appelée Valider. Ainsi, lorsque je vérifie ce bouton radio et que je clique sur le bouton "Exécuter", il appelle la méthode validate (). J'ai donc d'abord placé cette méthode dans une classe interne qui implémentait Runnable

class ValidateThread implements Runnable {
    public void run() {
        validate();
    }
}

J'ai ensuite appelé ce fil dans ActionListener du bouton "Exécuter" comme tel

runButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent ae) {
        // Some code checked on some radio buttons
        if(radioButton.isSelected()) {
            if(radioButton.getText().equals("VALIDATE")) {
               Runnable runnable = new ValidateThread();
               Thread thread = new Thread(runnable);
               thread.start();
            }
        }
    }

});

Voila! La sortie est maintenant envoyée à JTextArea.

Maintenant, vous remarquerez que JTextArea ne fera pas défiler vers le bas avec le texte. Donc, vous devez définir la position du curseur comme

textArea.setCaretPosition(textArea.getText().length() - 1);

Maintenant, lorsque les données sont ajoutées à JTextArea, elles défilent toujours vers le bas.

24
Ascalonian

Essaye ça:

jTextArea.update(jTextArea.getGraphics());
38
petr

Comme d'autres l'ont dit, cela nécessite le multithreading. Jetez un oeil à Concurrence dans Swing

Une solution consisterait à mettre en œuvre le traitement à l'aide d'un SwingWorker. La méthode doInBackground implémenterait le traitement et vous invoqueriez la méthode de publication avec la chaîne à ajouter comme argument. SwingWorker substitue alors la méthode de processus pour prendre un argument String et l’ajouter à la zone de texte.

4
Mark

Je suis désolé de répondre à cette question qui a été postée il y a 4 ans, mais j'ai une autre solution qui a fonctionné pour moi. Je viens d'utiliser des pointeurs pour mettre à jour la JTextAreade telle que:

//JScrollPane variable pane initialized with JTextArea area
//We will update area with new text
JTextArea temp = (JTextArea) pane.getViewPort().getView();
//new text to add
JTextArea c = new JTextArea();
c.append("text \n)";
//update through pointers
temp = c;
pane.validate();
1
collielimabean

Vous aurez besoin de multithreading pour cela. Prêt à prendre le plongeon?

0
Spencer Ruport

Si c'est multithreading, vous devez essayer ceci! http://www.devarticles.com/c/a/Java/Multithreading-in-Java/

0
binarycreations