2017-06-08 2 views
-2

Ich erstelle eine Fortschrittsbalken mit JLabel. Problem ist, wenn ich diese Bezeichnung zu meinem Rahmen hinzufüge und einige andere Aufgaben ausführe, mein JFrame einfriert. Gibt es eine Methode wie Invoke und warte auf Swing um seine Zeichnung zu vervollständigen?Wie erzwingen Sie Java, um Swing-Label zu zeichnen?

private void jButtonOKActionPerformed(java.awt.event.ActionEvent evt) { 
    JLabel loadingBar = new JLabel("test"); 
    myFrame.add(loadingBar); 
    doSomeOtherTasks(); 
} 
+1

Können Sie bitte eine [MCVE] zeigen? Dieser Code sollte nicht einfrieren –

+1

Wenn Ihre Benutzeroberfläche einfriert, tun Sie etwas falsch um die https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html – GhostCat

+1

Es ist nicht so sehr eine Frage der erzwingen Java, um das Label so zu aktualisieren, dass es den Event-Dispatch-Thread nicht blockiert, indem eine lang andauernde Task auf dem EDT ausgeführt wird. Um es anders auszudrücken: Blockiere nicht den EDT (Event Dispatch Thread). Die GUI wird "eingefroren", wenn das passiert. Weitere Informationen und das Update finden Sie unter [Parallelität in Swing] (https://docs.oracle.com/javase/tutorial/uiswing/concurrency/). –

Antwort

2

Versuchen Sie, diese

int delay = 1000; //milliseconds 
    ActionListener taskPerformer = new ActionListener() { 
     public void actionPerformed(ActionEvent evt) { 
      //...Perform a task... 
     } 
    }; 
    new Timer(delay, taskPerformer).start(); 
+1

Ohne weitere Erklärungen ist das nicht zu hilfreich. – GhostCat

+0

Ihr Vorschlag funktioniert perfekt, aber das Problem ist nach der Verzögerungszeit, die es noch einfriert. Die Methode doSomeOtherTasks() dauert fast 5 Sekunden. – hellzone

+1

muss der Timer angehalten werden ((Timer) evt.getSource()). Stop(); –

Verwandte Themen