Thread + JTextPane = Bug?

Status
Nicht offen für weitere Antworten.
J

Jack Gruber

Gast
Hallo allerseits,

ich bin neu hier und habe ein kleines Problem. Ich weiß jetzt nicht, ob es ein Bug ist, oder ob ich einfach nur schlampig programmiert habe. Ich schildere einfach mal mein Problem:

Ich habe eine GUI-Applikation geschrieben. Das Hauptprogramm ist eine Unterklasse von JFrame und reagiert auf mehrere Buttons etc. Drücke ich einen bestimmten Button, dann wird ein Timer (Unterklasse von Thread) gestartet, der alle 20 Minuten eine Methode des Hauptprogramms (JFrame) aufruft. In dieser Methode passieren verschiedene Sachen, bei denen eigene Exceptions auftreten können (diese fange ich dann auch gleich in der Methode ab). Tritt jetzt eine Exception auf, möchte ich einen modalen Dialog öffnen, der eine Warnung anzeigt.

Ich habe alles wie oben beschrieben implementiert (der Timer kann auch nur einmal gestartet werden). Bevor der Dialog erscheint wird der Timer gestoppt (mit thread.interrupt). Jetzt passiert allerdings in 10% der Fälle, wenn der Dialog erscheint, dass ein java.lang.Error auftritt. Und zwar ist von einem readLock in einem AbstracDocument die Rede. Irgendwie habe ich das Ganze dann auf die JTextPane zurückgeführt, die in dem modalen Dialog platziert war (dort sollte eine mehrzeiliger Text angezeigt werden).

Ich habe dann die JTextPane durch mehrere JLabels ersetzt und jetzt scheint es ohne Probleme zu funktionieren. Der Fehler ist seit dem nicht wieder aufgetreten.

Ist das ein bekannter oder unbekannter Bug? Oder habe ich das ganz unsauber oder unlogisch programmiert?
 
B

Beni

Gast
Swing unterstützt kein Multithreading, um was am Textpane zu ändern musst du einen Teil deines Threads mit dem EventDispatcher synchonisieren:

Code:
public void ichWerdeVonEinemThreadAufgerufen(){
  final JTextPane pane = ...
  final String text = "123";

  // Da muss noch irgendeine Exception abgefangen werden, weiss nicht mehr welche
  SwingUtilities.invokeAndWait( new Runnable(){
    public void run(){
      pane.setText( text );
    }
   });

   // hier gets weiter, sobald der Text gesetzt wurde
}
 
J

Jack Gruber

Gast
Oh, das ging ja schnell. Danke.

Aber der Thread ist ja nicht mehr aktiv. Ich habe ihn ja vor dem Aufruf des Dialogs interrrupted. Oder ist das die Nachlaufzeit, die Thread benötigt, um sich komplett zu verabschieden?

Aber bei den anderen GUI-Elementen ist das nicht nötig, oder doch? Ich wollte nämlich in der vom Thread aufgerufenen Methode noch andere GUI-Elemente des Hauptprogramms verändern (Ein paar JTextFields).
 
S

stev.glasow

Gast
Beni hat gesagt.:
Swing unterstützt kein Multithreading, um was am Textpane zu ändern musst du einen Teil deines Threads mit dem EventDispatcher synchonisieren:

Code:
public void ichWerdeVonEinemThreadAufgerufen(){
  final JTextPane pane = ...
  final String text = "123";

  // Da muss noch irgendeine Exception abgefangen werden, weiss nicht mehr welche
  SwingUtilities.invokeAndWait( new Runnable(){
    public void run(){
      pane.setText( text );
    }
   });

   // hier gets weiter, sobald der Text gesetzt wurde
}
Hoffe mal, dass ist jetzt nicht offtopic, aber ich Suche Momentan soetwas in SWT, kann jemand helfen?
 
S

stev.glasow

Gast
OK, Problem gelöst.
Code:
   new Thread(new Runnable() {
      public void run() {
         while (true) {
            try { Thread.sleep(1000); } catch (Exception e) { }
            Display.getDefault().asyncExec(new Runnable() {
               public void run() {
                  // ...
               }
            });
         }
      }
   }).start();
 
J

Jack Gruber

Gast
Oh, die Timer-Klasse habe ich ja total übersehen. Dabei habe ich meine Thread-Klasse auch noch AnalysationTimer genannt :D. Dann werde ich mich da mal umgucken.

Der Grund, warum mir der Fehler mit der JTextPane so seltsam vorkam, ist, dass ich bisher auf die gleiche Weise schon mehrere Test-Applikationen geschrieben habe. Also Hauptprogramm startet Thread, welcher in einer bestimmten Zeitspanne bestimmte GUI-Elemente des Hauptprogramms verändert, verschiebt, etc. Und da gab es keine Probleme. Weder Exceptions noch Errors noch unerklärliche Abstürze.

Zum Beispiel habe ich irgendwelche JLabels in einem Panel umherbewegt, sozusagen als Animation. Oder ich habe die Graphics-Klasse verändert und irgendwelche Kreise im Panel umherticken lassen. Daher dachte ich, dass man das mit Thread ruhig so machen kann.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Thread mit Button anhalten und wieder neu starten lassen AWT, Swing, JavaFX & SWT 3
P thread nimmt veränderte boolean nicht AWT, Swing, JavaFX & SWT 7
N JFrame loescht alles, sobald der Thread zuende ist AWT, Swing, JavaFX & SWT 22
M Server/Client thread von GUI Trennen AWT, Swing, JavaFX & SWT 2
K JavaFx, Sound Aufnahme und Thread AWT, Swing, JavaFX & SWT 0
T Exception in thread "main" java.lang.NoClassDefFoundError AWT, Swing, JavaFX & SWT 4
G Exception javafx Thread -> caused by removing children while in EventHandler AWT, Swing, JavaFX & SWT 28
H Event Handling Thread - Abruf der get-Methode AWT, Swing, JavaFX & SWT 5
J "Exception in thread "AWT-EventQueue-0"" Fehler AWT, Swing, JavaFX & SWT 3
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
C Thread verwalten AWT, Swing, JavaFX & SWT 2
A Swing Exception in thread "AWT-EventQueue-0" AWT, Swing, JavaFX & SWT 1
S JavaFX Exception in thread "JavaFX Application Thread" AWT, Swing, JavaFX & SWT 3
L Label im JavaFX Thread Updaten AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Alert Confirmation Dialog aus einem Service Thread AWT, Swing, JavaFX & SWT 8
ralfb1105 JavaFX MVC: Thread in Model Class mit Ausgabe in TextArea AWT, Swing, JavaFX & SWT 10
D Swing SwingUtils / Thread Problem AWT, Swing, JavaFX & SWT 3
J Thread per Button starten AWT, Swing, JavaFX & SWT 10
J Thread kennt JButton nicht. AWT, Swing, JavaFX & SWT 11
T JavaFX Task / Thread / FXThread Komplikationen AWT, Swing, JavaFX & SWT 5
O Swing Event Dispatch Thread AWT, Swing, JavaFX & SWT 1
L JavaFX UI Thread block AWT, Swing, JavaFX & SWT 13
X Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1 AWT, Swing, JavaFX & SWT 6
sandaime Swing Thread für CMD auslesen AWT, Swing, JavaFX & SWT 16
E JavaFX JavaFX Application in Thread ausführen AWT, Swing, JavaFX & SWT 1
D JavaFX UI-Thread und DB-Thread trennen um z.B. Ladebalken anzuzeigen AWT, Swing, JavaFX & SWT 15
T JavaFX Controller im extra Thread AWT, Swing, JavaFX & SWT 0
T Swing 2 Thread.sleep parallel laufen lassen AWT, Swing, JavaFX & SWT 4
L Zweites Fenster mit Thread AWT, Swing, JavaFX & SWT 0
E JavaFX Stage.show() in ursprünglichem Thread starten AWT, Swing, JavaFX & SWT 7
L Swing Frame in Thread wird nicht gezeichnet AWT, Swing, JavaFX & SWT 2
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
C Thread-/ Simulations- Problem AWT, Swing, JavaFX & SWT 18
T Swing Button bleibt grau [=> UI hat sich aufgehängt, Aufgabe in Thread auslagern] AWT, Swing, JavaFX & SWT 3
M Thread-Frage in SWT AWT, Swing, JavaFX & SWT 1
Q GUI außerhalb GUI-Thread updaten - GUI friert ein AWT, Swing, JavaFX & SWT 18
C Thread in Klassen starten AWT, Swing, JavaFX & SWT 4
L exception in thread awt-eventqueue-0 java.lang.nullpointerexception AWT, Swing, JavaFX & SWT 2
S Swing Exception in thread "AWT-EventQueue-0" bei Jlabel AWT, Swing, JavaFX & SWT 4
D SWT SWT Elemente aus anderen Klassen aufrufen - Invalid thread access AWT, Swing, JavaFX & SWT 6
K JavaFX Tableview mit fxml ohne Aktualiserung trotz Thread AWT, Swing, JavaFX & SWT 13
K Event Handling 2 Buttons und Thread stop AWT, Swing, JavaFX & SWT 3
C Swing Update von swing-TableModels per Thread. Eins geht, das andere nicht, warum? AWT, Swing, JavaFX & SWT 12
V JLabel bzw. GUI aus externen Thread ansteuern AWT, Swing, JavaFX & SWT 3
J Applet Paralleles Thread Handling AWT, Swing, JavaFX & SWT 3
H Swing JfreeChart aktualisieren - mit daten aus thread AWT, Swing, JavaFX & SWT 3
T Java Swing Main GUI Thread AWT, Swing, JavaFX & SWT 3
C Event Handling Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException AWT, Swing, JavaFX & SWT 43
T Table-Zeilen mit Thread einfärben AWT, Swing, JavaFX & SWT 15
F Swing GUI-Thread für automatisches Update nutzen AWT, Swing, JavaFX & SWT 10
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
V Nullpointerexception (etwas mit thread und jframe) AWT, Swing, JavaFX & SWT 3
P Problem Thread.sleep() und JProgressBar AWT, Swing, JavaFX & SWT 7
S SWT GUI-Thread AWT, Swing, JavaFX & SWT 11
A Thread und sleep(1000); AWT, Swing, JavaFX & SWT 7
B Swing Thread+Animation AWT, Swing, JavaFX & SWT 7
S Timer oder Thread.sleep AWT, Swing, JavaFX & SWT 3
M Exception in thread "Thread-3" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 18
B Über SWT Button Thread beenden AWT, Swing, JavaFX & SWT 2
C SWT Gui Thread hängt sich auf AWT, Swing, JavaFX & SWT 3
lumo SWT Exception in thread "main" org.eclipse.swt.SWTError: No more handles AWT, Swing, JavaFX & SWT 3
Luk10 Swing Problem mit Zeichen-Thread AWT, Swing, JavaFX & SWT 8
G 2D-Grafik Von Thread aus Zeichnen AWT, Swing, JavaFX & SWT 5
U Swing JLabel bewegen mittels Thread AWT, Swing, JavaFX & SWT 3
M JProgressBar für einen Thread AWT, Swing, JavaFX & SWT 14
R JTable und Thread AWT, Swing, JavaFX & SWT 4
K Thread.sleep in GUI AWT, Swing, JavaFX & SWT 4
J Thread funktioniert nicht AWT, Swing, JavaFX & SWT 10
D JPanel mit Thread in JPanel AWT, Swing, JavaFX & SWT 4
F Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: null AWT, Swing, JavaFX & SWT 5
P Teil einer Swing GUI in eigenem Thread AWT, Swing, JavaFX & SWT 4
S Thread.sleep() in einer methode fürs zeichen AWT, Swing, JavaFX & SWT 3
O JTree/TreeModel/DefaultMutableTreeNodes thread safe machen AWT, Swing, JavaFX & SWT 3
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
F SWT table refresh per Thread AWT, Swing, JavaFX & SWT 2
V Swing remove(Component) blockiert Thread sehr lange. AWT, Swing, JavaFX & SWT 6
J AWT Artefakte bei AWT-Rendering durch parallelen Thread AWT, Swing, JavaFX & SWT 4
H Thread-Problem mit der Darstellung beim Sperren des Fensters AWT, Swing, JavaFX & SWT 2
T Event Dispatch Thread und noch ein Thread AWT, Swing, JavaFX & SWT 7
Burny91 Swing Thread mit wait() und notify() steuern AWT, Swing, JavaFX & SWT 22
N SWT - über Thread Composite erstellen und Anhängen AWT, Swing, JavaFX & SWT 6
K Vom Gui aus auf einen Thread warten AWT, Swing, JavaFX & SWT 4
X Problem bei JTextArea und Thread.sleep() AWT, Swing, JavaFX & SWT 8
F Merkwürdiges Verhalten zeichnen sperater Thread AWT, Swing, JavaFX & SWT 13
B Swing Swing und Thread.sleep() AWT, Swing, JavaFX & SWT 6
N Exception Behandlung mit setDefaultUncaughtExceptionHandler, insbesondere im EventDispatcher Thread AWT, Swing, JavaFX & SWT 4
Q Neuer Thread zum Öffnen AWT, Swing, JavaFX & SWT 2
P Swing GUI im Thread? AWT, Swing, JavaFX & SWT 5
T GUI JFrame - neuer Thread AWT, Swing, JavaFX & SWT 2
data89 Was mache ich mit "Dispatched Event Thread"/Substance falsch? AWT, Swing, JavaFX & SWT 4
0x7F800000 Allg. Frage zum ev. dispatch thread, wie korrekt auf reaktion der Listener warten? AWT, Swing, JavaFX & SWT 4
S Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 7
T thread.sleep Sprung Problem AWT, Swing, JavaFX & SWT 24
N Server mit Thread und Statusbox AWT, Swing, JavaFX & SWT 3
S Objektverhalten in einen Thread legen AWT, Swing, JavaFX & SWT 4
G JProgressBar actionPerformedMethode und SwingUI thread AWT, Swing, JavaFX & SWT 36
E Komponenten in Event Dispatch Thread erzeugen? AWT, Swing, JavaFX & SWT 4
J Thread in GUI einbauen AWT, Swing, JavaFX & SWT 2
Lony AbstractTableModel Exception in thread "AWT-EventQueue- AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben