Système..println à JTextArea
EDIT: j'ai édité le post pour préciser ma question, maintenant, j'ai moi-même plus de compréhension.
Je suis essentiellement, comme le titre le dit, la tentative de sortie de la console à mon JTextArea
dans mon GUI, tout en accomplissant les tâches de l'application.
Voici ce que je fais actuellement:
public class TextAreaOutputStream extends OutputStream
{
private final JTextArea textArea;
private final StringBuilder sb = new StringBuilder();
public TextAreaOutputStream(final JTextArea textArea)
{
this.textArea = textArea;
}
@Override
public void flush()
{
}
@Override
public void close()
{
}
@Override
public void write(int b) throws IOException
{
if (b == '\r')
return;
if (b == '\n')
{
final String text = sb.toString() + "\n";
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
textArea.append(text);
}
});
sb.setLength(0);
}
sb.append((char) b);
}
}
Ci-dessus aura été re-direct System.out
à mon flux de sortie ci-dessus et, par conséquent, l'envoi d'un événement à l' EventQueue
de mettre à jour mon GUI (JTextArea
).
Voici la question:
Actuellement à l'aide de invokeLater()
va comme il est dit sur les docs:
Causes runnable to have its run method called in the dispatch thread of the EventQueue. This will happen after all pending events are processed.
Donc, ce que je veux faire est d'effectuer une mise à jour de l'interface graphique (appel run()
) avant de traiter tout le reste dans le EventQueue.
Est-il possible d'injecter un événement essentiellement dans mon EventQueue? Ou quelqu'un peut-il m'indiquer un tutoriel décent sur ce domaine?
merci,
System.out
appel serait de travailler et un autre échecOriginalL'auteur buymypies | 2013-02-05
Vous devez vous connecter pour publier un commentaire.
L'exemple suivant crée l'image avec la zone de texte et redirige Système.de:
Rien de mal à dormir sur le Thread Initial, mais il faut construire des composants GUI sur l'EDT.
Il y a plusieurs problèmes mineurs avec votre approche, c'est à dire de la sortie de chaque
'\n'
deux fois, mais rien de ce qui peut conduire à la solution du problème que vous avez décrit. Êtes-vous sûr que!"".equals(targetFile.getText())
etcheckBox.isSelected()
sont à la fois vrai?OriginalL'auteur Mikhail Vladimirov
Votre erreur doit se trouver quelque part d'autre que vous n'avez pas montré encore. Voici un très simple démo qui fonctionne comme prévu avec presque le même code que le vôtre (je n'correction de quelques problèmes mineurs):
invokeLater()
. Ma solution fonctionne, mais pas comme je le désir, c'est à dire Mon interface graphique est mis à jour cependant pas jusqu'à ce que après tout le reste dans leEventQueue
est traité - que la...
dans mon extrait ci-dessus. Ce qui n'est pas ce que je veux.Btw,
JTextArea.append
est Thread-safe, il n'est pas nécessaire de les envelopper dans uninvokeLater()
.Veuillez voir mon edit de ma question, j'espère avoir fait plus claire de ce que je suis en train de faire.
1) Pas besoin d'envelopper
JTextArea.append
dans uninvokeLater()
. 2) Si vous envisagez de le ré-ordonnancement des événements sur le EventQueue, oublier (il n'est pas difficile à faire): cela signifie que vous avez une fausse conception de quelque part. Si vous devez exécuter les opérations de longue durée, ne pas effectuer sur l'EDT, mais utilisent à la place un SwingWorker à cette fin.OriginalL'auteur Guillaume Polet
Vous pourriez avoir besoin d'utiliser
PipedOutputStream
... voir les réponses à la question ici:Comment faire pour rediriger toutes les sorties de la console pour un Swing JTextArea/JTextPane avec le bon encodage?
Fondamentalement, ce que ce n'est, il redirige la
System.out
à un tampon, à partir de laquelle, le programme peut lire à la sortie imprimée avecSystem.out
. Ceci est appeléPiping
OriginalL'auteur Aniket Inge
Si vous voulez voir l'effet de défilement dans la Zone de Texte, puis, au lieu de l'ajout de la sortie, vous pouvez mettre le nouveau texte au début.
Exemple:
OriginalL'auteur Abhishek Kumar
J'ai trouvé un très simple, mais peut-être pas le plus rapide ou le meilleur moyen pour ce faire. Il est, cependant, très simple, et si vous êtes paresseux comme je suis, alors il fonctionne très bien.
OriginalL'auteur Blue Dev