Quelle est la meilleure façon de garantir la livraison lors de l'utilisation d'un SwingWorker? J'essaye de diriger des données d'un InputStream vers un JTextArea, et j'exécute mon SwingWorker avec la méthode execute
. Je pense que je suis l'exemple here, mais je reçois des résultats hors d'usage, des doublons, et un non-sens général.Swingworker produisant des sorties/sorties en double dans le désordre?
Voici mon SwingWorker non-travail:
class InputStreamOutputWorker extends SwingWorker<List<String>,String> {
private InputStream is;
private JTextArea output;
public InputStreamOutputWorker(InputStream is, JTextArea output) {
this.is = is;
this.output = output;
}
@Override
protected List<String> doInBackground() throws Exception {
byte[] data = new byte[4 * 1024];
int len = 0;
while ((len = is.read(data)) > 0) {
String line = new String(data).trim();
publish(line);
}
return null;
}
@Override
protected void process(List<String> chunks)
{
for(String s : chunks)
{
output.append(s + "\n");
}
}
}
Exécutez-vous plusieurs travailleurs à la fois? – TofuBeer
Avez-vous essayé de l'utiliser dans le fil Swing Dispatcher? A moins que votre flux d'entrée ne soit trop lent (> 1 seconde) alors je le mettrais dans le DispatchThread. Il n'y a pas assez de code ou de contexte pour identifier les problèmes. –
Un seul opérateur est exécuté à la fois et le flux d'entrée prend des données pendant plusieurs heures. –