2010-11-23 28 views
2

J'essaye de charger une URL dans un JEditorPane ou un JTextPane mais l'URL est une page PHP générée dynamiquement. Je veux ensuite traiter la sortie de la page PHP dans mon application Java. La page PHP produira toujours au moins une chaîne que je peux utiliser pour vérifier qu'elle est générée correctement.Comment puis-je savoir si un document ou une page JEditorPane/TextPane a fini de se charger?

Si je tente de traiter la page droite après avoir réglé la page en utilisant

JEditorPane.setPage(URL); 
if(outputTracker.getText().contains("desktop_process")) 

retourne une page HTML vide, même si je spécifie un type de contenu text/plain pour JEditorPane:

System.out.println(outputTracker.getText()); 

Je suppose que c'est parce que la page PHP n'a pas fini de charger car la méthode ci-dessous retournera la bonne sortie à chaque fois.

En ce moment je suis mise en page puis à partir d'une minuterie Swing et vérifier toutes les 200ms si la page contient la chaîne générée correctement:

private void getPageBtnActionPerformed(java.awt.event.ActionEvent evt) {           
    outputTracker.setPage("URL_GOES_HERE?variables=x&y=a"); 
    check_response_timer.start(); 
} 

ActionListener checkAction = new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
     if(outputTracker.getText().contains("desktop_process")) { 
      System.out.println("Checking results..."); 
      check_response_timer.stop(); 
      process_response(); 
     } else { 
      num_checks++; 
      System.out.println("Checking results..."); 
      if(num_checks == 10) { 
       check_response_timer.stop(); 
       checkLater = true; 
       responseLbl.setText("Connection timeout. Please click reconnect to check again."); 
       num_checks = 0; 
      } 
     } 
    } 
}; 
private Timer check_response_timer = new Timer(200,checkAction); 

Cela fonctionne très bien. Avec les charges actuelles du serveur et la complexité actuelle des pages PHP en cours de chargement, la boucle s'arrête après la première itération mais cela semble juste un peu inefficace et je ne veux pas continuer à vérifier si la page va prendre plusieurs secondes charger lors de lourdes charges serveur ou sur des pages PHP plus complexes.

Je me demande s'il y a une meilleure façon de vérifier que la page a fini de charger. Je me demandais si je pouvais utiliser la méthode JEditorPane.read (inputStream) ou définir la page dans un thread Swing Background Worker, puis traiter la sortie de la page PHP lorsque le worker() est appelé.

Et y a-t-il un meilleur moyen de charger la sortie PHP, en le lisant directement dans une chaîne à partir de la sortie générée dynamiquement sans l'utilisation d'un éditeur car l'éditeur n'est pas visible?

Espérons que cela soit suffisamment clair.

Merci.

Répondre

2

Vous pouvez ajouter un PropertyChangeListener dans le volet de l'éditeur:

editorPane.addPropertyChangeListener("page", ...); 

Cependant, cela ne vous dira quand la page principale est chargée. Il ne vous dira pas quand les images ou d'autres fichiers associés ont finalisé le chargement.

+0

OK cool. Merci beaucoup. J'ai essayé un document propertyChangeListener sur le document mais ceci retourné plusieurs fois avant de montrer le résultat correct. Je n'ai pas pensé à essayer de changer de document en page. Je vais essayer. Les pages que je charge sont en pur texte, donc je n'ai pas besoin de me soucier des fichiers externes. Merci – drent

+0

Cela a fonctionné parfaitement! Merci! – drent

+0

Si cela fonctionne, acceptez la réponse. –