In Swing gibt es zwei verschiedene Muster von Aufgaben im Zusammenhang mit Hintergrundtasks, die immer wieder auftreten:
[ul]
[li]Langwierige Berechnungen in einen Hintergrundthread auslagern[/li][li]Einen bestimmten Task immer wieder ausführen, und diese Ausführung mit „Start/Pause/Stop“ kontrollieren[/li][/ul]
Für ersteres gibt es natürlich den SwingWorker
, aber um vieles „drumherum“ muss man sich noch selbst kümmern. Im speziellen z.B. darum, dass während der Berechnung ein Dialog angezeigt wird. Da bietet der ProgressMonitor
zwar auch schon einige Möglichkeiten, allerdings ist der nicht leicht zu konfigurieren, und der Teufel steckt auch dort oft im Detail…
Um das ganze etwas zu vereinfachen, habe ich ein paar Utility-Klassen erstellt. Das ganze liegt unter GitHub - javagl/SwingTasks: Utility classes for task execution in Swing
Die „Readme“ beschreibt schon die grobe Idee dahinter, und es gibt ein paar Beispiele, die zeigen, wie man das ganze verwenden kann. Darum hier nur kurz: Wenn man in Swing z.B. auf einen Buttonklick hin eine Methode ausführen will, die potentiell lange rechnet, und man während dieser Berechnung gerne einen modalen Dialog anzeigen möchte (was für mich der „Standardfall“ ist), dann ist das mit
SwingTaskExecutors.create(SomeClass::someMethod).build().execute();
erledigt: Der SwingTaskExecutor
kümmert sich dann um alles
Für letzteres (das wiederholte Ausführen eines Tasks, mit Start/Pause/Stop usw) habe ich auch ein paar Helferlein erstellt. Grob gesagt gibt es ein Task
-Interface, das man implementiert, und einen TaskRunner
übergibt, den man dann mit den Buttons auf einen TaskRunnerControlPanel
steuern kann, um den Task zu starten, wiederholt auszuführen, oder zu stoppen. (Beispiele dazu folgen ggf. noch - im Moment gibt es einen Test, der die grundsätzliche Verwendung schonmal zeigt).
Feedback (insbesondere negatives, im Sinne von Verbesserungsvorschlägen :D) ist immer willkommen