2016-03-23 15 views
0

Ich verwende javax.swing, um die GUI für eine kleine Anwendung zu erstellen. Alles funktioniert gut, aber ich habe ein wenig Zweifel. Ich möchte eine JProgressBar verwenden, um anzuzeigen, dass der Prozessexport ausgeführt wird. Wie die Klasse Post selbst implementiert Runnable, wenn Anruf setIndeterminate() kurz nach run(), wird es ausgeführt, noch bevor export() ist vorbei, wie Java legte es in einem anderen Thread.Einstellen einer JProgressBar

Hat jemand eine Idee, wie man es löst?

this.jProgressBar2.setIndeterminate(true); 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 

      Post post = new Post(); 
      post.export(); 
     } 
    }); 

    this.jProgressBar2.setIndeterminate(true); 

Antwort

4

Ihr Problem ist, dass seit post.export() in einem Hintergrund-Thread ausgeführt wird (ich nehme an), dann Ihr Code nicht blockiert, und der Code nach dem Laufe Methode sofort aufgerufen werden.

Vorschläge:

  • Lassen Sie sich als den Code der SwingUtilities.invokeLater(new Runnable() { Anweisung los läuft bereits auf dem Event Thread Schaukel und so tut dies nichts.
  • Sie benötigen einen Benachrichtigungsmechanismus, wenn der Post fertig exportiert wird. Give Veröffentlichen Sie ein SwingPropertyChangeSupport-Objekt sowie eine addPropertyChangeListener(...)-Methode, mit der externe Klassen (hier die GUI) PropertyChangeListeners hinzufügen und diese mit Beans-Bindung sowie PropertyChangeListeners verwenden können, um die GUI zu benachrichtigen, wenn die Verarbeitung abgeschlossen ist. Dies geschieht durch den Aufruf des entsprechenden firePropertyChange(...) auf dem Support-Objekt, wenn der Export abgeschlossen ist.