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

すべてが完全に正常に動作しますが、これは正しい方法ですか? プログラムの実行アクションは停止して最初からやり直すことができますが、一時停止して再開することはできないため、Service の代わりに Task を使用しました。

4

1 に答える 1

0

Service だけを使用することにしました。複数回実行できる関数を処理する方がはるかに簡単です。

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 に答える