2010-03-16 4 views
2

En Java, j'ai un paquet qui traduit les métadonnées XML d'un standard à l'autre. Ce paquet est finalement accédé par une seule fonction et envoie toute sa sortie à travers un objet PrintStream. La sortie envoyée est juste un statut de chaque fichier et si oui ou non il a été traduit.Quel est le meilleur moyen, si possible, d'envoyer des informations d'un Java PrintStream vers un JTextPane?

C'est assez bien beau si je l'impression juste System.out, mais je suis vouloir en fait d'imprimer à un JTextPane tout il se traduit (un peu comme une zone de texte de progression). Il ne serait pas très compliqué d'imprimer le statut après la traduction du XML, mais comme il peut y avoir des milliers de fichiers XML, ce n'est pas faisable. Une chose que j'ai essayée est d'utiliser un thread qui prend toutes les informations de PrintStream (qui est attaché à un ByteArrayOutputStream) et le laisse envoyer toute nouvelle information au volet de texte. Malheureusement, cela envoie toujours l'information tout à la fois à la fin de la traduction. Ce fonctionne correctement pour System.out.

Voici le code qui fait la traduction et essaie de montrer la sortie:

public class ConverterGUI extends javax.swing.JFrame { 

    boolean printToResultsBox = false; 
    PrintStream printStream = null; 
    ByteArrayOutputStream baos = null; 

    private class ResultsPrinter implements Runnable { 

     public ResultsPrinter() { 
      baos = new ByteArrayOutputStream(); 
      printStream = new PrintStream(baos); 
     } 

     public void run() { 
      String tempString = ""; 
      while (printToResultsBox) { 
       try { 
        if (!baos.toString().equals(tempString)) { 
         tempString = baos.toString(); 
         resultsBox.setText(tempString); 
        } 
       } catch (Exception ex) { 
       } 
      } 
     } 
    } 

    ... 

    ResultsPrinter rp = new ResultsPrinter(); 
    Thread thread = new Thread(rp); 
    thread.start(); 

    // Do the translation. 
    try { 
     printToResultsBox = true; 
     boolean success = false; 
     TranslationEngine te = new TranslationEngine(); 
     // fileOrFolderToConvert is a text box in the GUI. 
     // linkNeeded and destinationFile are just parameters for the translation process. 
     success = te.translate(fileOrFolderToConvert.getText(), linkNeeded, destinationFile, printStream); 
     if (success) { 
      printStream.println("File/folder translation was a success."); 
     } 
     resultsBox.setText(baos.toString()); 
    } catch (Exception ex) { 
     printStream.println("File translation failed."); 
    } finally { 
     printToResultsBox = false; 
    } 

    ... 

} 

En fin de compte, ce code affiche la JTextPane très bien après tout la traduction se fait, mais pas pendant. Aucune suggestion? Dois-je changer le PrintStream en quelque chose d'autre?

Répondre

2

Le problème avec le fonctionnement de votre thread est que vous n'êtes pas sur le thread d'événement de l'interface utilisateur lors de la mise à jour de votre boîte de résultats. Jetez un oeil à la classe SwingWorker. Ou vous pouvez même utiliser le SwingUtilities.invokeAndWait

Questions connexes