The following is my Task initialization

        final Task<Void> vt=voiceTask();
        Button btn = new Button();
        btn.setText("Say");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                new Thread(vt).start();
            }
        });

And here is the task coding

public Task<Void> voiceTask() {
    return new Task<Void>(){
        @Override
        protected Void call() throws Exception {
            HelloWorld hw=new HelloWorld();// HelloWorld is simple .java class getting voice through sphinx
            updateMessage(hw.Hello());
            return null;

        }

    };
}     

Now on clicking the btn Button for the first time,the task functions normally, but on clicking for subsequent times the task is not called.

I want task to be called on every click. Please advice me how to modify my code to do so...

有帮助吗?

解决方案

See the JavaDocs.

As with FutureTask, a Task is a one-shot class and cannot be reused.

You need to create a new Task each time the button is pressed.

    final Button btn = new Button();
    btn.setText("Say");
    btn.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            final Task<Void> vt=voiceTask();
            vt.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
                @Override
                public void handle(WorkerStateEvent event) {
                    btn.setDisable(false);
                }
            });
            btn.setDisable(true);
            new Thread(vt).start();
        }
    });
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top