Frage

Ich habe eine Benutzeroberfläche in einem JFrame gebaut. Eine der Tasten startet einen langjährigen Anruf (immer noch im selben Java -Prozess), und während der Ausführung ist die Benutzeroberfläche eingefroren.

Ich dachte, um klar zu machen, dass die Dinge noch ausgeführt werden, kann ich eine Fortschrittsleiste, vielleicht in einem Popup, anzeigen, damit der Benutzer über das, was das Programm tut, auf dem neuesten Stand gehalten werden kann.

Ich erstelle also einen neuen JDIALOG, füge ihm eine JProgressbar hinzu und aktualisiere ihn, wenn Dinge passieren. Das Problem ist, dass der Inhalt des Dialogfelds nicht aktualisiert wird. Änderungen, die ich an seinem Titel vornehme, werden sofort angezeigt, und alles, was ich für die Konsole ausgibt, aber nichts in der Benutzeroberfläche selbst.

Gibt es einen Befehl, den ich ausgeben kann, um ein Repaint zu erzwingen?

Hier ist der Kern dieses Abschnitts:

  killWindow = new JDialog();
  killWindow.setUndecorated(true);
  killWindow.setTitle("stopping tests - 0 of " + numActive);
  killProgress = new JProgressBar(0, numActive);
  killWindow.add(killProgress);
  killProgress.setStringPainted(true);
  killWindow.pack();
  killWindow.setLocationRelativeTo(frame);
  killWindow.setVisible(true);

Dann, während wir Fortschritte machen ...:

  killProgress.setValue(++killedTests);                    // not seen!
  killProgress.setString("Killing test on " + nickname()); // not seen!
  log("Killed another test, " + killedTests + " so far");  // visible in real time
  killWindow.setTitle("stopping tests - " + killedTests +
                      " of " + killProgress.getMaximum()); // visible in real time

Was vermisse ich? Ich habe hier versucht zu googeln und zu suchen, und habe nichts Offensichtliches gesehen?

War es hilfreich?

Lösung

Sie müssen Ihre langjährige Aufgabe in einem anderen Thread ausführen.

Es gibt diesen Thread namens "AWT Event Dispatch -Thread", der für die Aktualisierung von UI -Komponenten verantwortlich ist. Wenn es damit beschäftigt ist, Ihre langjährige Aufgabe auszuführen Gewohnheit Aktualisieren Sie die Benutzeroberfläche (noch aktualisieren Sie Ihren Dialog).

Sie können in Betracht ziehen, zu verwenden Schwunglutilitäten oder ein Swingworker.

Vom Swingworker Dokumentation Hier ist ein Beispiel

final JLabel label;
class MeaningOfLifeFinder extends SwingWorker<String, Object> {
   @Override
   public String doInBackground() {
       return findTheMeaningOfLife();
   }

   @Override
   protected void done() {
       try { 
           label.setText(get());
       } catch (Exception ignore) {
       }
   }
}

(new MeaningOfLifeFinder()).execute();

Wenn Sie Ihre lange Aufgabe in einem anderen Thread ausführen, können Sie dem AWT -Event -Versand -Thread eine reaktionsschnelle Benutzeroberfläche anzeigen.

Sie können sich das ansehen. "Lektion aus dem Java -Tutorial"Um diese Konzepte besser zu verstehen.

Andere Tipps

Es hört sich so an, als würden Sie Ihre langjährige Aufgabe im Event Dispatch Thread (EDT) ausführen. Schauen Sie sich Swingworker an. Wenn Sie 1.6 verwenden, ist es eingebaut:

http://java.sun.com/javase/6/docs/api/javax/swing/swingworker.html

Wenn nicht, finden Sie weitere Informationen unter:

http://en.wikipedia.org/wiki/swingworker

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top