JOptionPane blockt Änderungen an GUI?

...komplette Frage anzeigen

3 Antworten

Beachte die Reihenfolge der Anweisungen. Erst muss der Text in das Textfeld geschrieben, danach das JOptionPane geöffnet werden.

Ok, moment. Bei einer JOptionPane funktioniert es komischerweise wieder.

Allerdings kommt das Problem auch bei einem Socket vor.

Wenn ich bei einem Klick auf einen Button erst den Text in textfield ändern möchte und danach mit

Socket client = new Socket("localhost", 12345);

eine Verbindung zu einem Server aufbauen möchte, bleibt der Button solange gedrückt, bis letztendlich über den Catch-Block

JOptionPane.showMessageDialog(null, "Server nicht erreichbar");

angezeigt wird. Und erst dann wird auch der Text in textfield geändert.

Daher wäre die Frage, wie man erst den Text in textfield ändern kann, bevor das Programm versucht, die Verbindung aufzubauen.

Hier mal die pastebin: http://pastebin.com/tBGA4zyE

0
@Eurocrafter

Der Event Dispatch Thread (EDT), welcher die GUI zeichnet, ist auch für die Handhabung der Events zuständig. Wenn die setText-Methode dem zugehörigen Observer mitteilt, dass sich der Label-Zustand geändert hat, ist das vorerst irrelevant, denn der EDT ist noch bei der Ausführung der actionPerformed-Methode.

Nun gibt es 2 fixe Möglichkeiten, dieses Problem zu lösen.

  • Du startest in der actionPerformed-Methode einen neuen Thread, der den Text des Labels setzt
  • Du startest einen neuen Thread mithilfe von SwingUtilities.invokeLater
SwingUtilities.invokeLater(new Runnable() {
  public void run() {
    textfield.setText("Anderer Text");
  }
});

1

Soweit ich weiß werden Änderungen an der GUI erst nach dem abarbeiten der Events angezeigt. Generell solltest du auch im Event Thread keine langwierigen Operationen ausführen und diese an andere Threads delegieren.

Wenn die dann widerum mit der GUI agieren können, musst du das in ein Runnable einkapseln und mittels der SwingUtilities.invokeLater() funktion im richtigen Thread ausführen lassen.

ja klar ich weiß wie das geht

Jaja... sei leise :D 

1

Was möchtest Du wissen?