タスクを実行し、ビューに追加できるウィジェットを作成するというアイデアがありますが、完全に間違った角度から問題に取り組んでいる可能性があるのではないかと心配しています。ここに私の抽象クラスがあります
public abstract class AbstractWidget extends AnchorPane
{
private Thread thread;
protected Task<?> task;
public AbstractWidget()
{
}
public void start()
{
this.thread = new Thread(this.task);
this.thread.start();
}
public void stop()
{
this.task.cancel();
}
}
実装 (プログラムの実行時間を追跡するウィジェット)
public class RuntimeWidget extends AbstractWidget
{
public RuntimeWidget()
{
this.task = new Task<Void>()
{
@Override
public void run()
{
final long startTime = System.currentTimeMillis();
while(true)
{
if (isCancelled())
break;
Platform.runLater(new Runnable()
{
@Override
public void run ()
{
long secs = System.currentTimeMillis() -startTime) / 1000;
String display = String.format("%02d:%02d", (secs % 3600) / 60, (secs % 60));
System.out.println(display);
}
});
try {
Thread.sleep(1000);
} catch ( InterruptedException e ) {
e.printStackTrace();
}
}
}
};
}
}
FXML コントローラーでのウィジェットの使用
public void initialize(URL fxmlFileLocation, ResourceBundle resources)
{
RuntimeWidget runtimeWidget = new RuntimeWidget();
gridPane.add(runtimeWidget, 0, 0);
}
@FXML private void handleRunAction( ActionEvent event ) throws IOException, InterruptedException
{
runtimeWidget.start();
}
すべてが完全に正常に動作しますが、これは正しい方法ですか? プログラムの実行アクションは停止して最初からやり直すことができますが、一時停止して再開することはできないため、Service の代わりに Task を使用しました。