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?
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.
Essaye ça:
jTextArea.update(jTextArea.getGraphics());
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.
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 JTextArea
de 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();
Vous aurez besoin de multithreading pour cela. Prêt à prendre le plongeon?
Si c'est multithreading, vous devez essayer ceci! http://www.devarticles.com/c/a/Java/Multithreading-in-Java/