Swing GUI wird nach invokeLater() langsam

MorrisF

Mitglied
Hallo liebes Java-Forum,
ich habe mit dem WindowBuilder von Eclipse einen JFrame gebastelt. Nun habe ich ein Label, dass in einer Methode mit Text gefüllt wird, dann wird 4 Sekunden gewartet und es kommt zu dem alten Text noch ein neuer.
Hier der Code der Methode:
Java:
private void Warten() throws Exception {
    try {
        LabelText.setText("ich warte gleich . . .");
        new Thread(new Runnable() {
            public void run() {
                try {
                    SwingUtilities.invokeLater(this);
                    Thread.sleep(4000);
                    LabelText.setText(Labeltext.getText() + " ich habe gewartet");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    } catch (Exception e) {
        e.getCause().printStackTrace();
    }
}
Da ich
Java:
SwingUtilities.invokeLater(this);
verwende, habe ich den kleinen Thread erstellt, weil wenn ich nur
Java:
Thread.sleep(4000);
gemacht habe, hat mir nicht "ich warte gleich . . ." ins Label geschrieben (why ever...?).
Auf jeden Fall sehe ich jetzt das "ich warte gleich . . ." und dann nach 4 Sekunden "ich warte gleich . . . ich habe gewartet".
Mein Problem ist jetzt aber, dass nach dieser Methode meine ganze GUI hängt. Wenn man zb einen Button anklickt, dann wird der klick erst nach ca 10 Sekunden ausgeführt.
Woran könnte das liegen?
Und kennt jemand vielleicht einen schöneren Weg, um an mein Ziel zu kommen?

Besten Dank im Voraus, für eure Hilfe!
MFG
Morris
 

Robat

Top Contributor
Weil du dadurch den Thread der GUI (EDT) pausiert hast und damit deine GUI einfriert.
Und kennt jemand einen schöneren Weg, um an mein Ziel zu kommen?
Über die javax.swing.Timer Klasse
Java:
public class Test {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setSize(500,500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JLabel labelText = new JLabel("");

        JButton button = new JButton("Press me");
        button.addActionListener(event -> {
            labelText.setText("ich warte gleich . . .");
            Timer timer = new Timer(4000, e -> labelText.setText(labelText.getText() + " ich habe gewartet"));
            timer.start();
        });

        frame.add(labelText);
        frame.add(button, BorderLayout.SOUTH);
        frame.setVisible(true);
    }
}
 

MorrisF

Mitglied
Danke erstmal, für die schnelle Antwort!
leider bin ich etwas überfragt, was du im Code mit den Pfeilen
Java:
button.addActionListener(event -> {
            labelText.setText("ich warte gleich . . .");
            Timer timer = new Timer(4000, e -> labelText.setText(labelText.getText() + " ich habe gewartet")
in diesem abschnitt machst...
Habe sowas noch nie gesehen (Sorry, mache noch nicht soo lange Java)
 

Robat

Top Contributor
Das ganze nennt sich Lambda-Ausdruck.
Du musst es aber auch nicht "mit den Pfeilen" machen, sondern kannst ganz normal eine anonyme innere Klasse erstellen:
Java:
button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent event) {
        labelText.setText(...);
        Timer timer = ....
        timer.start();
    }
});
 

MorrisF

Mitglied
Ahh, das sieht schon verständlicher aus! xD
Danke!
Hätte da noch ein paar Fragen:
Warum braucht der Timer das ActionEvent? Gibt es auch Timer, die das nicht brauchen?
Weil ich rufe meine Warten() Methode nicht nur von einem Button aus auf und außerhalb vom Button hab ich ja dann kein ActionEvent.
 

Robat

Top Contributor
Der Konstruktor von javax.swing.Timer erwartet 2 Parameter. Der erste delay ist die Zeit vor dem Ausführen der Aktion. Über den zweiten Parameter, welcher vom Typ ActionListener ist, wird definiert, was ausgeführt werden soll. Du brauchst hier also kein ActionEvent des Buttons. Du gibst über den ActionListener nur an, "was der Timer ausführen soll".
Java:
public static void main(String[] args) {
    Timer timer = new Timer(1000, new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent event) {
              System.out.println("Hallo Welt");
         }
    });
    timer.start(); 
}
 

MorrisF

Mitglied
Verstehe! Vielen Dank!
in meinem Fall soll er ja 4 Sekunden warten... muss ich dann wieder ein
Code:
Thread.sleep(4000);
machen? aber dann hab ich ja wieder das Problem, dass die GUI hängt... oder?
 

mihe7

Top Contributor
sondern will nur einmal 4 Sekunden warten
Das ist einfach und Du hattest das Problem schon fast gelöst:
Java:
        new Thread(new Runnable() {
            public void run() {
                try {
                    Thread.sleep(4000);
                    SwingUtilities.invokeLater(new Runnable() {
                        @Override
                        public void run() {
                            LabelText.setText(Labeltext.getText() + " ich habe gewartet");
                        }
                    });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
 

mihe7

Top Contributor
Alternativ funktioniert das natürlich auch mit Timer:
Java:
    Timer timer = new Timer(4000, new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent event) {
             LabelText.setText(Labeltext.getText() + " ich habe gewartet");
         }
    });
    timer.setRepeats(false); // nur einmal
    timer.start();
 

MorrisF

Mitglied
ja, ich denke schon.
Timer macht alles zyklisch,(außer man macht
Code:
setRepeats(false):
)
und
Code:
Thread.sleep();
wartet nur einmal.

Mein Problem war ja, dass meine GUI wegen dem
Code:
Thread.sleep();
eingefroren is, was ja jetzt mit der richtigen Verwendung von
Code:
invokeLater
behoben wurde.
...oder?
 

mihe7

Top Contributor
Das ist ein Teil davon. Speziell geht es mir darum:
Java:
        new Thread(new Runnable() {
            public void run() {
                try {
                    SwingUtilities.invokeLater(this);
                    Thread.sleep(4000);
                    LabelText.setText(Labeltext.getText() + " ich habe gewartet");

Du erstellst ja einen neuen Thread und in dem Runnable rufst Du Thread.sleep() auf. Warum aber friert dann die GUI ein?
 
X

Xyz1

Gast
Zuerst habe ich mich gewundert, dass keine Queue überläuft....

Es ginge natürlich auch um in seinem Schema zu bleiben wobei nüschts einfriert und was schon sehr sehr genau ist:
Java:
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
/**
 */
public class Test {
    public static void main(String[] args) {
        JFrame f = new JFrame();
        JLabel l = new JLabel();

        f.add(l);
        f.setSize(300, 100);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(4000);
                    SwingUtilities.invokeLater(new Runnable() {
                        @Override
                        public void run() {
                            l.setText("4 Sek. gewartet: " + (System.currentTimeMillis() / 1000) % 1000);
                        }
                    });
                    new Thread(this).start();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}


@mihe7 akzeptabel?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Nach Export als Runnable Jar wird css nicht merh gefunden AWT, Swing, JavaFX & SWT 22
T JavaFX Nach Zoomen wird an falscher Stelle gezeichnet AWT, Swing, JavaFX & SWT 0
H Musik wird nach dem erstellen der .jar Datei nicht mehr abgespielt AWT, Swing, JavaFX & SWT 1
D iText PDF wird nach Neustart nicht importiert AWT, Swing, JavaFX & SWT 0
J 2D-Grafik Linie wird nach Mausklick nicht am richtigen Ort gezeichnet AWT, Swing, JavaFX & SWT 11
A JPanel wird nach Buttonklick nicht angezeigt AWT, Swing, JavaFX & SWT 2
B Etwas was nach jedem GUI 'click' ausgeführt wird AWT, Swing, JavaFX & SWT 6
J 2D-Grafik JPanel wird erst 1-2sek nach start des JFrames angezeigt AWT, Swing, JavaFX & SWT 3
M Image wird nicht neugezeichnet nach dem Wechsel AWT, Swing, JavaFX & SWT 2
R JPanel wird erst neu gezeichnet nach erneuter auswahl AWT, Swing, JavaFX & SWT 8
H JTree - nach Auswahl aus JFileChooser wird nur der erste Knoten angezeigt AWT, Swing, JavaFX & SWT 3
F setIcon wird erst nach der methode ausgeführt AWT, Swing, JavaFX & SWT 4
S Swing PopUp oeffnet sich nach der Methode, die erst nach Fensteraufruf gestartet wird AWT, Swing, JavaFX & SWT 3
S JComboBox wird nach removeAll falsch dargestellt AWT, Swing, JavaFX & SWT 2
S JComboBox in JTable wird erst nach klick angezeigt AWT, Swing, JavaFX & SWT 2
A JTree wird erst nach Klick aktualisiert AWT, Swing, JavaFX & SWT 2
H Es wird nach "main" verlangt AWT, Swing, JavaFX & SWT 9
M Cursor wird nach JFileChosser nicht gesetzt AWT, Swing, JavaFX & SWT 3
R nach setSize() wird JLabel nicht dargestellt AWT, Swing, JavaFX & SWT 3
F Frame wird nicht angezeigt nach while-Schleife AWT, Swing, JavaFX & SWT 3
P Methode wird nicht überprüft AWT, Swing, JavaFX & SWT 4
P paintComponent-Methode wird dauernd neu aufgerufen AWT, Swing, JavaFX & SWT 2
G JavaFX LineChart Datenpunkte Markierung wird abgeschnitten AWT, Swing, JavaFX & SWT 1
P JTextField wird nur sehr klein angezeigt und verändert die Größe nicht AWT, Swing, JavaFX & SWT 3
Telisti Javafx Image wird nicht richtig integiert AWT, Swing, JavaFX & SWT 8
J Netbeans die JavaFX-Anwendung wird nicht ausgeführt AWT, Swing, JavaFX & SWT 16
N €-Zeichen wird nicht akzeptiert AWT, Swing, JavaFX & SWT 4
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
_user_q Objekt.setSelected(false), wenn es nicht mehr fokussiert wird AWT, Swing, JavaFX & SWT 2
S Javafx getResource-Pfad wird nicht erkannt AWT, Swing, JavaFX & SWT 7
U Warum wird zweimal die Affinetransformation estellt (2Dgraphics, Java)? AWT, Swing, JavaFX & SWT 31
DonBronson Gezeichnetes Objekt verschwindet nachdem erneut gezeichnet wird AWT, Swing, JavaFX & SWT 8
ProggersWorld JavaFX TextArea BackgroundImage wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
M Bild wird nicht geladen obwohl sie gefunden wird AWT, Swing, JavaFX & SWT 0
izoards Outlook Mail erstellen - Signatur wird nicht angezeigt. AWT, Swing, JavaFX & SWT 3
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
J Swing Komponente wird unpassend angepasst in der Größe AWT, Swing, JavaFX & SWT 35
J Java FX NullPointerException, ObservableList wird in View nicht angezeigt.. AWT, Swing, JavaFX & SWT 34
S Next_Button wird nicht ausgeführt. AWT, Swing, JavaFX & SWT 6
FrittenFritze Ein Problem mit der CSSBox, die Größe wird nicht angepasst AWT, Swing, JavaFX & SWT 5
CptK windowClosed() nur aufrufen, wenn Fenster nicht über Button geschlossen wird AWT, Swing, JavaFX & SWT 1
J Komponente wird manchmal falsch gezeichnet AWT, Swing, JavaFX & SWT 0
J Swing JList wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
JMölleri Swing Image wird unscharf dargestellt AWT, Swing, JavaFX & SWT 2
JojoSand Java Programm wird nicht gestartet - keinen Fehlerhinweis AWT, Swing, JavaFX & SWT 9
R Text vom Jlabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
D JavaFX Bearbeitetes Bild wird nicht gespeichert AWT, Swing, JavaFX & SWT 9
J setOnCloseRequest wird nicht ausgelöst AWT, Swing, JavaFX & SWT 3
P JavaFX Fenster wird nicht angezeigt (Mac) AWT, Swing, JavaFX & SWT 13
B JavaFX Bei Scenen-Wechsel im primaryStage wird aktuelle Fenstergröße nicht mit übernommen AWT, Swing, JavaFX & SWT 16
B JavaFX Warum wird hier eine NullPointer-Exception geworfen? AWT, Swing, JavaFX & SWT 7
M JavaFX javaFX Label-Text wird nicht gesetzt AWT, Swing, JavaFX & SWT 3
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
L Swing JLabel wird beim ändern der Schriftart immer neu gezeichnet. AWT, Swing, JavaFX & SWT 2
R Layout Manager null und Component wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 3
Zrebna JavaFX-Projekt mit Bildern funktioniert nicht - um Hilfe wird gebeten AWT, Swing, JavaFX & SWT 14
kodela BufferStrategy wird nicht gefunden AWT, Swing, JavaFX & SWT 5
J JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
S ImageView wird dem Gridpane nicht zugefügt AWT, Swing, JavaFX & SWT 1
G Repaint wird nicht durchgeführt AWT, Swing, JavaFX & SWT 8
E Warum wird Text im JTextArea erst am Programmende angezeigt ? AWT, Swing, JavaFX & SWT 1
S Swing Panel wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
Bluedaishi TableView mit Combox wert wird nicht in die TableView gesetzt AWT, Swing, JavaFX & SWT 38
L JFrame wird zu klein erstellt AWT, Swing, JavaFX & SWT 7
kodela Swing Letzte Änderung in der Tabelle wird nicht gespeichert AWT, Swing, JavaFX & SWT 5
cool_brivk24 AWT BufferedImage wird nicht geladen AWT, Swing, JavaFX & SWT 17
S JavaFX Wird es überhaupt genutzt? AWT, Swing, JavaFX & SWT 3
FRI3ND GUI wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
J Canvas wird nicht angezeigt AWT, Swing, JavaFX & SWT 10
K Swing JScrollPane wird nicht angezeigt wenn man Components darstellt. AWT, Swing, JavaFX & SWT 2
ralfb1105 Swing Wert in JTextField wird falsch ausgegeben AWT, Swing, JavaFX & SWT 2
B JavaFX Text wird nicht angezeigt, kein Fehler AWT, Swing, JavaFX & SWT 2
J Aus welchen Grund wird der Button nicht angezeigt im GridPane? AWT, Swing, JavaFX & SWT 1
J MouseListener wird nicht ausgeführt. AWT, Swing, JavaFX & SWT 4
E Swing Liste in Scrollpane wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
J Controller wird zu groß, was tun ? AWT, Swing, JavaFX & SWT 5
CptK Wieso wird nur ein Teil meiner Buttons angezeigt? AWT, Swing, JavaFX & SWT 1
T Label wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
M Aktion ausführen wenn ein JRadiobutton deselektiert wird. AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing JPanel "ContentPane" wird nicht gesetzt/angezeigt AWT, Swing, JavaFX & SWT 16
I JavaFX Fenster wird auf einem anderen Rechner anders dargestellt AWT, Swing, JavaFX & SWT 5
zhermann FX Label text wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 12
zhermann TableView wird nicht gefüllt AWT, Swing, JavaFX & SWT 14
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
zhermann JavaFX Main App wird nicht geöffnet AWT, Swing, JavaFX & SWT 6
Naxon89 JavaFX Image wird nicht korrekt geladen AWT, Swing, JavaFX & SWT 3
4 Swing JLabel wird ,,abgehackt" AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing Größe des JPanel ändern/wird nicht geändert. AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing JPanel wird in JScollPane nicht angezeigt AWT, Swing, JavaFX & SWT 2
D JFrame wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 1
P Kein Bild wird angezeigt bei ImageIcon AWT, Swing, JavaFX & SWT 16
MaxG. JavaFX Inhalt in Tableview wird nicht angezeigt AWT, Swing, JavaFX & SWT 11
T JButton wird beim vergrößern des Fensters erst sichtbar AWT, Swing, JavaFX & SWT 4
A Swing Tabelle wird bei Betätigung des Button nicht befüllt AWT, Swing, JavaFX & SWT 17
krgewb 2D-Grafik paint-Methode wird zu oft ausgeführt AWT, Swing, JavaFX & SWT 5
G Nur ein JPanel wird angezeigt AWT, Swing, JavaFX & SWT 9
M Swing Inhalt meines JTables wird falsch dargestellt AWT, Swing, JavaFX & SWT 8
T Default Table wird nicht angezeigt AWT, Swing, JavaFX & SWT 15

Ähnliche Java Themen

Neue Themen


Oben