# GUI Element in einer Methode aktualisieren (JTextPane)



## RED000DEATH (9. Dez 2015)

Hallo liebe Kollegen,
Ich habe ein kleines Problem was die aktualisierung meines JTextPanes angeht, ich öffne darin eine php-Datei (auf einem Server) und möchte das Ergebnis auslesen, jedoch wird der Inhalt des JTextPanes erst dann aktualisiert, wenn ein JOptionPane.showMessageDialog() geöffnet wird. Ansonsten ist der Inhalt des JTextPanes nicht "0"/"1" sonder "".
Nach dem öffnen des JOptionPane hat er dann den gewünschten Wert ("0"/"1") und nicht mehr "".
Gibt es eine Möglichkeit dieses JOptionPane zu umgehen und trotzdem den Wert zu bekommen? mit jOptionPane1.repaint(); und jOptionPane1.revalidate(); funktioniert es leider nicht.
Weiter unten ist ein Teil des Codes.



```
try {
     this.TxpBrowser.setPage("http://adresse.de/datei.php?username=" + txfUsername.getText() + "&password=" + passwordhash);
     try{
          Thread.sleep(2000);
     }catch(InterruptedException e){}
}catch(Exception e){
     JOptionPane.showMessageDialog(null ,"Es konnte keine Verbindung zur Datenbank hergestellt werden! Bitte überprüfen Sie Ihre Internet Verbindung!", "Fehler beim Verbinden zur Datenbank!", JOptionPane.ERROR_MESSAGE);
     System.exit(0);
}
try {
     JOptionPane.showMessageDialog(this, "Loginversuch wird gestartet...", "Login...", JOptionPane.INFORMATION_MESSAGE); //Wenn diese Zeile fehlt aktualisiert er das JTextPane (TxpBrowser) nicht. --> loginstatus = ""
     loginstatus = TxpBrowser.getDocument().getText(0, TxpBrowser.getDocument().getLength());
} catch (BadLocationException ex) {
     System.out.println(ex);
}
```


Vielen Dank schon mal im voraus,
Patrick Langkau


----------



## Joose (9. Dez 2015)

Du legst den Thread schlafen dadurch macht er nichts -> auch keine UI Aktualisierung.

http://stackoverflow.com/questions/9419252/why-does-this-simple-java-swing-program-freeze


----------



## VfL_Freak (9. Dez 2015)

Moin,



RED000DEATH hat gesagt.:


> Ich habe ein kleines Problem was die aktualisierung meines JTextPanes angeht, ich öffne darin eine php-Datei (auf einem Server) und möchte das Ergebnis auslesen, jedoch wird der Inhalt des JTextPanes erst dann aktualisiert, wenn ein JOptionPane.showMessageDialog() geöffnet wird. Ansonsten ist der Inhalt des JTextPanes nicht "0"/"1" sonder "".
> Nach dem öffnen des JOptionPane hat er dann den gewünschten Wert ("0"/"1") und nicht mehr "".
> 
> Gibt es eine Möglichkeit dieses JOptionPane zu umgehen und trotzdem den Wert zu bekommen? mit jOptionPane1.repaint(); und jOptionPane1.revalidate(); funktioniert es leider nicht.


Bitte was ?? 

Welche "Textpane" ???
Wo siehst wann ("0"/"1") ???



RED000DEATH hat gesagt.:


> Gibt es eine Möglichkeit dieses JOptionPane zu umgehen und trotzdem den Wert zu bekommen? mit jOptionPane1.repaint(); und jOptionPane1.revalidate(); funktioniert es leider nicht.


Was meinst Du mit "umgehen" ??
Wenn Du einen Messagedialog anzeigen willst wohl kaum - es seit denn Du bastelst Dir was eigenes ....

Geht es Dir darum, den Messagedialog quasi zu aktualisieren, damit sich der angezeigte Inhalt ändert?
Dann kannst Du den ersten Dialog schließen und ihn erneut mit anderem Inhalt aufrufen ... oder Du setzt mit "setMessage" einen neuen Textinhalt!

Gruß Klaus


----------



## RED000DEATH (9. Dez 2015)

Joose hat gesagt.:


> Du legst den Thread schlafen dadurch macht er nichts -> auch keine UI Aktualisierung.
> 
> http://stackoverflow.com/questions/9419252/why-does-this-simple-java-swing-program-freeze



Hallo schon mal vielen Dank für die Nachricht  bin garnicht darauf gekommen das es an dem sleep liegen könnte  Habe es jetzt entfernt, jedoch wird der Inhalt ohne das JOptionPane trotzdem nicht aktualisiert. muss also leider an etwas anderem liegen :/


----------



## VfL_Freak (9. Dez 2015)

Moin,



RED000DEATH hat gesagt.:


> ... wird der Inhalt ohne das JOptionPane trotzdem nicht aktualisiert .../


Was genau meinst Du denn damit ??
So richtig klar ist immer noch nicht, was Du eigentlich genau versuchst !!

Gruß Klaus


----------



## Joose (9. Dez 2015)

Welches Control aktualisiert sich nun nicht? Das JTextPane oder JOptionPane?
Im 1.Post war von JTextPane die rede ... das aktualisiert sich wegen den sleep nicht (GUI Thread schlafen gelegt).


----------



## RED000DEATH (9. Dez 2015)

VfL_Freak hat gesagt.:


> Moin,
> 
> 
> Was genau meinst Du denn damit ??
> ...



Hallo 
Ich habs vielleicht ein bisschen schlecht erklärt ich versuche es mal geschwind nochmal 
Also das Programm ist ein Log-In Programm  man gibt einen Benutzernamen und ein Passwort an (das Passwort wird verschlüsselt aber das tut ja nichts zur Sache^^) dies wird dann an eine php-Datei im Browser (den TxpBrowser) übergeben, diese php Datei überprüft einfach ob diese Kombination in einer MySql-Datenbank vorhanden ist und gibt je nachdem 1 für ja, 0 für nein zurück. Mein Programm soll nun diese Zahlen auswerten. Das Problem dabei ist, die Zahl (Website) wird im TxpBrowser nicht angezeigt bevor die Methode des Button Click Events fertig durchlaufen ist. 
Wenn ich jetzt jedoch ein JOptionPane davor anzeigen lasse, wird (aus irgendeinem Grund) im TxpBrowser die Seite angezeigt bevor die Methode vollständig durchlaufen wurde (was das Auswerten der Zahl möglich macht).
Eigentlich will ich dieses JOptionPane garnicht, jedoch wird ohne das JOptionPane die Seite nicht in den TxpBrowser eingelesen.


Puh... hoffe das war verständlicher 

Vielen dank schon mal 

Gruß Patrick


----------



## RED000DEATH (9. Dez 2015)

Joose hat gesagt.:


> Welches Control aktualisiert sich nun nicht? Das JTextPane oder JOptionPane?
> Im 1.Post war von JTextPane die rede ... das aktualisiert sich wegen den sleep nicht (GUI Thread schlafen gelegt).



Hallo  Genau es geht um das JTextPane  wenn ich das sleep entferne aktualisiert es sich jedoch trotzdem nicht :/

Gruß Patrick


----------



## Harry Kane (9. Dez 2015)

Wird das JTextPane nicht aktualisiert oder hat loginStatus den falschen Wert?


----------



## RED000DEATH (9. Dez 2015)

Harry Kane hat gesagt.:


> Wird das JTextPane nicht aktualisiert oder hat loginStatus den falschen Wert?


Hallo ,
loginstatus ist leer, da das JTextPane zu diesem Zeitpunkt noch nicht aktualisiert wurde.

Gruß Patrick


----------



## Harry Kane (9. Dez 2015)

Aber wird die JTextPane _überhaupt _aktualisiert und zeigt dann das richtige an, auch ohne die JOptionPane?


----------



## RED000DEATH (9. Dez 2015)

Harry Kane hat gesagt.:


> Aber wird die JTextPane _überhaupt _aktualisiert und zeigt dann das richtige an, auch ohne die JOptionPane?


Es wird aktualisiert nachdem die Methode durchlaufen ist oder vorher ein JOptionPane geöffnet wurde, das Richtige zeigt es dann auch an. Ich versuche blos hinzubekommen, dass er es schon vor dem Ende der Methode und ohne das JOptionPane das JTextPane aktuallisiert.

Gruß Patrick


----------



## Joose (10. Dez 2015)

Ich habe dir weiter oben schon gesagt wo das Problem liegt.
Weitere Informationen: Aktualisierungen der UI sollten im EventDispatcherThread (EDT), da dieser auch das Zeichnen übernimmt, vorgenommen werden. Mittels SwingUtilities sollte das einfach realisierbar sein.


----------



## Harry Kane (10. Dez 2015)

@Joose: Ich glaube das Problem ist etwas diffiziler.


RED000DEATH hat gesagt.:


> jedoch wird der Inhalt des JTextPanes erst dann aktualisiert, wenn ein JOptionPane.showMessageDialog() geöffnet wird


So wie es aussieht, ist diese Aussage zumindest missverständlich. Offenbar wird der Inhalt der JTextPane auch ohne JOptionPane aktualisiert, aber nicht so schnell, dass die Variable loginStatus den INhalt repräsentiert.

Zitat aus der API-Dokumentation von JEditorPane.setPage:


> *This may load either synchronously or asynchronously depending upon the document returned by the EditorKit. If the Document is of type AbstractDocument and has a value returned by AbstractDocument.getAsynchronousLoadPriority that is greater than or equal to zero, the page will be loaded on a separate thread using that priority.*
> 
> *If the document is loaded synchronously, it will be filled in with the stream prior to being installed into the editor with a call to setDocument, which is bound and will fire a property change event.* If an IOException is thrown the partially loaded document will be discarded and neither the document or page property change events will be fired. If the document is successfully loaded and installed, a view will be built for it by the UI which will then be scrolled if necessary, and then the page property change event will be fired.
> 
> *If the document is loaded asynchronously, the document will be installed into the editor immediately using a call to setDocument which will fire a document property change event, then a thread will be created which will begin doing the actual loading. In this case, the page property change event will not be fired by the call to this method directly, but rather will be fired when the thread doing the loading has finished. It will also be fired on the event-dispatch thread. *Since the calling thread can not throw an IOException in the event of failure on the other thread, the page property change event will be fired when the other thread is done whether the load was successful or not.


Meine Vermutung: du lädst das Dokument asynchron, und das laden dauert länger als die 2 Sekunden, die du den EDT schlafen legst. Wenn du die JOptionPane anzeigst, wartest du mit dem Bestätigen offenbar länger als 2 sec, und während der Zeit wird das Dokument vollständig geladen. Schlauerweise hast du uns nicht gesagt, wie lange du typischerweise die JOptionPane anzeigst, und ob die Anzeigedauer einen Einfluss auf das Ergebnis hat (ich würde vermuten, dass ja, und dass loginStatus auch dann einen falschen Wert hat, wenn du die JOptionPane sofort zumachst).
Entweder: ((AbstractDocument)TxpBrowser.getDocument()).setAsynchronousLoadPriority(-1)
oder: du hängst einen PropertyChangeListener an den TxpBrowser und liest den Inhalt erst dann aus wenn nach dem Laden das PropertyChangeEvent gefeuert wird.


----------

