JavaFX中的自定义可运行节点

时间:2012-12-18 01:55:59

标签: java multithreading javafx-2 javafx

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

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,因为程序的运行操作可以停止并重新启动,但从不暂停和恢复。

1 个答案:

答案 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
            }
        }
    }
}