2013-06-04 27 views
5

Tôi muốn tắt một nút trong một thời gian cụ thể trong ứng dụng JavaFX. Có bất kỳ tùy chọn để làm điều này? Nếu không, có bất kỳ công việc xung quanh cho điều này?JAVAFX: Làm thế nào để tắt nút cho thời gian cụ thể?

Dưới đây là mã của tôi trong ứng dụng. Tôi đã thử Thread.sleep, nhưng tôi biết đây không phải là cách hay để ngăn người dùng nhấp vào nút tiếp theo.

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

Trả lời

5

Bạn có thể sử dụng các phương pháp đơn giản của một thread cung cấp các cuộc gọi GUI có liên quan (thông qua runLater() tất nhiên):

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

Đó có lẽ không phải là cách thú vị nhất để đạt được nó, nhưng hoạt động một cách an toàn.

2

Phương pháp để vô hiệu hóa một điều khiển JavaFX là:

myButton.setDisable(true); 

Bạn có thể thực hiện logic thời gian lập trình trong bất kỳ cách nào bạn muốn, bằng cách bỏ phiếu hẹn giờ hoặc bằng cách có phương pháp này gọi để đáp ứng với một số sự kiện.

Nếu bạn đã tạo thể hiện nút này thông qua FXML trong SceneBuilder, thì bạn nên gán nút fx: id để tham chiếu của nó được tự động đưa vào đối tượng bộ điều khiển của bạn trong khi tải biểu đồ cảnh. Điều này sẽ làm cho nó dễ dàng hơn cho bạn để làm việc với trong mã điều khiển của bạn.

Nếu bạn đã tạo nút này theo chương trình, khi đó bạn sẽ có sẵn tham chiếu trong mã của mình.

+0

Tôi đã sử dụng myButton.setDisable (true); của nó làm việc nhưng làm thế nào tôi sẽ áp dụng logic thời gian cho nó.Tôi đã cố gắng Thread.sleep cho thời gian đó nhưng toàn bộ ứng dụng có được treo cho rằng time.Can cụ thể bạn cung cấp ví dụ nhỏ? ngay sau đó tôi sẽ cập nhật mã trong câu hỏi. – Rohan

4

Bạn cũng có thể được sử dụng 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

Hi Uluk, nó không hoạt động trong mã của tôi. Hãy xem câu hỏi được cập nhật, những thay đổi tôi đã thực hiện trong mã của tôi vốn không hoạt động. – Rohan

+0

Nó có phải là một ngoại lệ không? Hãy thử trao đổi các dòng nextButton.setDisable (false) và nextButton.setDisable (true). –

+0

Nó không phải là ném bất kỳ ngoại lệ. Sau khi thay đổi mã theo nút gợi ý của bạn sẽ không bị vô hiệu hóa. – Rohan

0

Hoặc bạn có thể sử dụng một dịch vụ và ràng buộc tài sản chạy đến disableProperty của nút nào bạn muốn vô hiệu hóa.

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

Nhưng giải pháp Dòng thời gian do Uluk Biy cung cấp, trông thanh lịch hơn.

Các vấn đề liên quan