2013-06-04 15 views
5

Chcę wyłączyć przycisk dla określonego czasu w aplikacji JavaFX. Czy jest jakaś opcja, aby to zrobić? Jeśli nie, czy jest jakieś obejście tego?JAVAFX: Jak wyłączyć przycisk na określony czas?

Poniżej znajduje się mój kod aplikacji. Próbowałem Thread.sleep, ale wiem, że to nie jest dobry sposób, aby powstrzymać użytkownika od kliknięcia na następny przycisk.

nextButton.setDisable(true); 
final Timeline animation = new Timeline(
     new KeyFrame(Duration.seconds(delayTime), 
     new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent actionEvent) { 
       nextButton.setDisable(false); 
      } 
     })); 
animation.setCycleCount(1); 
animation.play(); 

Odpowiedz

5

Można użyć prostego podejścia wątku, który zapewnia odpowiednie połączenia GUI (poprzez runLater() oczywiście):

new Thread() { 
    public void run() { 
     Platform.runLater(new Runnable() { 
      public void run() { 
       myButton.setDisable(true); 
      } 
     } 
     try { 
      Thread.sleep(5000); //5 seconds, obviously replace with your chosen time 
     } 
     catch(InterruptedException ex) { 
     } 
     Platform.runLater(new Runnable() { 
      public void run() { 
       myButton.setDisable(false); 
      } 
     } 
    } 
}.start(); 

To nie może neatest sposobem osiągnięcia, ale działa bezpiecznie.

2

Sposób wyłączyć kontrolę JavaFX jest:

myButton.setDisable(true); 

można zaimplementować logikę czasową programowo w dowolny sposób, albo przez odpytywanie czasomierza lub posiadające tej metody wywoływane w odpowiedzi na jakieś wydarzenie.

Jeśli stworzyłeś tę instancję przycisku przez FXML w SceneBuilder, powinieneś przydzielić przyciskowi fx: id, aby jego referencja była automatycznie wprowadzana do obiektu kontrolera podczas ładowania wykresu sceny. Ułatwi to pracę z kodem kontrolera.

Jeśli ten przycisk został utworzony programowo, w kodzie będzie już dostępne jego odwołanie.

+0

Użyłem już myButton.setDisable (true); działa, ale jak będę stosować do niego logikę czasową. Próbowałem Thread.sleep na ten czas, ale cała aplikacja się zawiesza w tym określonym czasie. Czy możesz podać mały przykład? wkrótce zaktualizuję kod, o którym mowa. – Rohan

4

można być również pomocą Timeline:

final Button myButton = new Button("Wait for " + delayTime + " seconds."); 
    myButton.setDisable(true); 

    final Timeline animation = new Timeline(
      new KeyFrame(Duration.seconds(delayTime), 
      new EventHandler<ActionEvent>() { 
       @Override public void handle(ActionEvent actionEvent) { 
        myButton.setDisable(false); 
       } 
      })); 
    animation.setCycleCount(1); 
    animation.play(); 
+0

Cześć Uluk, to nie działa w moim kodzie. Zobacz zaktualizowane pytanie, zmiany zrobiłem w moim kodzie, który nie działa. – Rohan

+0

Czy zgłasza wyjątek? Spróbuj zamienić linie nextButton.setDisable (false) i nextButton.setDisable (true). –

+0

Nie rzuca żadnego wyjątku. Po zmianie kodu zgodnie z sugestią przycisk nie jest wyłączany. – Rohan

0

Lub można skorzystać z usługi i wiążą właściwość działa na disableProperty przycisku chcesz wyłączyć.

public void start(Stage stage) throws Exception { 
    VBox vbox = new VBox(10.0); 
    vbox.setAlignment(Pos.CENTER);  

    final Button button = new Button("Your Button Name"); 
    button.setOnAction(new EventHandler<ActionEvent>() {    
     @Override 
     public void handle(ActionEvent event) { 
      Service<Void> service = new Service<Void>() {     
       @Override 
       protected Task<Void> createTask() { 
        return new Task<Void>() { 
         @Override 
         protected Void call() throws Exception { 
          Thread.sleep(5000);//Waiting time 
          return null; 
         } 
        }; 
       } 
      }; 
      button.disableProperty().bind(service.runningProperty());    
      service.start(); 
     } 
    });  

    vbox.getChildren().addAll(button); 
    Scene scene = new Scene(vbox, 300, 300); 
    stage.setScene(scene); 
    stage.show(); 
} 

Ale rozwiązanie Timeline podane przez Uluk Biy wygląda bardziej elegancko.

Powiązane problemy