2016-08-02 13 views

Antwort

1

Ohne mehr Code kann ich nur eine Vermutung machen. Selbst Ihr hinzugefügter Code reicht nicht aus, um alle Aspekte Ihrer Implementierung zu kennen.

Diese Lösung geht davon aus, dass Sie eine Aufgabe haben, die ausgeführt wird und deren Fortschritt auf einer Progressbar anzeigt. Die Aufgabe ist hier in einen Service verpackt, der neu gestartet werden kann (vielleicht brauchen Sie das auch?).

import javafx.application.Application; 
import javafx.beans.binding.Bindings; 
import javafx.concurrent.Service; 
import javafx.concurrent.Task; 
import javafx.concurrent.Worker; 
import javafx.event.ActionEvent; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.ProgressBar; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

public class CancelButtonDemo extends Application { 

    Service<Integer> service = new MyService(); 

    @Override 
    public void start(Stage primaryStage) { 

     Button start = new Button(); 
     Button cancel = new Button(); 
     ProgressBar progress = new ProgressBar(0); 

     start.setText("Run Task"); 
     start.setOnAction((ActionEvent event) -> { 
      if (!(service.getState().equals(Worker.State.READY))) { 
       service.reset(); 
      } 
      progress.progressProperty().bind(service.progressProperty()); 
      service.start(); 
     }); 
     start.disableProperty().bind(service.runningProperty()); 

     cancel.setText("Cancel Task"); 
     cancel.setOnAction((ActionEvent event) -> { 
      service.cancel(); 
      progress.progressProperty().unbind(); 
      progress.setProgress(0); 
     }); 
     cancel.disableProperty().bind(Bindings.not(service.runningProperty())); 

     VBox root = new VBox(20); 
     root.setAlignment(Pos.CENTER); 
     root.getChildren().addAll(start, progress, cancel); 
     Scene scene = new Scene(root, 300, 250); 
     primaryStage.setTitle("Cancel Button Demo"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

    class MyService extends Service<Integer> { 

     @Override 
     protected Task<Integer> createTask() { 
      return new Task<Integer>() { 

       @Override 
       protected Integer call() throws Exception { 
        int iterations; 
        for (iterations = 0; iterations < 10000000; iterations++) { 
         if (isCancelled()) { 
          updateMessage("Cancelled"); 
          break; 
         } 
         updateMessage("Iteration " + iterations); 
         updateProgress(iterations, 10000000); 
        } 
        return iterations; 
       } 
      }; 
     } 
    } 
} 

Die obige Anwendung sieht wie folgt aus:

enter image description here

+0

Ich möchte nur die Taste deaktivieren abzubrechen, wenn Aufgabe abgeschlossen ist .. –

+0

Ich habe meine Antwort udpated. – NwDev

+0

Sie haben diese Tasten gemacht. Aber in meinem Abbrechen Taste ist standardmäßig.So ist es ein bisschen schwierig, das zu deaktivieren. –

Verwandte Themen