我有一个想法来创建执行任务并可以添加到视图中的小部件,但我担心我可能会从完全错误的角度解决问题。这是我的抽象类
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();
}
一切正常,但这是正确的方法吗?我使用任务而不是服务,因为程序的运行操作可以停止并重新启动,但永远不会暂停和恢复。