0

我有一个想法来创建执行任务并可以添加到视图中的小部件,但我担心我可能会从完全错误的角度解决问题。这是我的抽象类

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();
}

一切正常,但这是正确的方法吗?我使用任务而不是服务,因为程序的运行操作可以停止并重新启动,但永远不会暂停和恢复。

4

1 回答 1

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
            }
        }
    }
}
于 2013-01-10T00:00:21.710 回答