我有一个想法是创建执行任务的小部件,并且可以添加到视图中,但我担心我可能从完全错误的角度接近问题。这是我的抽象类
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();
}
一切都运行得很好但这是正确的方式吗?我使用Task而不是Service,因为程序的运行操作可以停止并重新启动,但从不暂停和恢复。
答案 0 :(得分:0)
我决定只使用服务。处理可以多次运行的函数要容易得多。
public abstract class AbstractWidget extends Whatever
{
protected Service<?> service;
public AbstractWidget()
{
}
public void start()
{
service.start();
}
public void stop()
{
service.cancel();
service.reset();
}
}
然后你可以创建一个类:
public class MyWidget() extends AbstractWidget
{
public MyWidget()
{
this.service. = new MyService();
}
private class MyService extends Service<Void>
{
protected Task<Void> createTask()
{
@Override
return new Task<Void>()
{
// whatever
}
}
}
}