Samstag, Dezember 14, 2019

JavaFX: so deaktivieren Sie eine Schaltfläche für eine bestimmte Zeit?

Möchte ich deaktivieren Sie eine Schaltfläche für eine bestimmte Zeit in JavaFX-Anwendung. Gibt es eine Möglichkeit, dies zu tun? Wenn nicht, gibt es eine Arbeit um für dieses?

Unten ist mein code in der Anwendung. Ich habe versucht Thread.sleep, aber ich weiß, das ist nicht die gute Art und Weise zu unterbinden, dass der Benutzer durch klicken auf die Schaltfläche weiter.

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();
InformationsquelleAutor Rohan | 2013-06-04

4 Kommentare

  1. 5

    Können Sie mit der einfachen Methode von einem thread, stellt die entsprechenden GUI-Aufrufe (durch runLater() natürlich):

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

    Es ist vielleicht nicht der sauberste Weg, aber sicher funktioniert.

  2. 4

    Könnten Sie sich auch mit der 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();
    • Hi Uluk, es funktioniert nicht in meinem code .siehe die aktualisierte Frage, änderungen, die ich in meinem code, die nicht funktioniert.
    • Ist es eine Ausnahme? Versuchen Sie, tauschen Sie die Zeilen nextButton.setDisable(false) und nextButton.setDisable(true).
    • Es ist nicht das werfen einer Ausnahme . Nach ändern des Codes wie pro Ihren Vorschlag-button ist nicht immer deaktiviert.
  3. 2

    Die Methode zum deaktivieren eines JavaFX-control:

    myButton.setDisable(true);

    Implementieren Sie können die Zeit, die Logik, die programmgesteuert in irgendeiner Weise, die Sie wünschen, entweder per polling-timer durch diese Methode wird aufgerufen, in Reaktion auf bestimmte Ereignisse.

    Wenn Sie diese Schaltfläche beispielsweise durch FXML im SceneBuilder, dann sollten Sie zuweisen den button fx:id, so dass die Referenz automatisch injiziert, die in Ihrem controller-Objekt beim laden der scene graph. Dadurch wird es einfacher für Sie, mit zu arbeiten, die in Ihrem controller-code.

    Wenn Sie diese Schaltfläche programmatisch, dann werden Sie bereits über den Verweis in Ihrem code verfügbar.

    • Ich habe bereits verwendet „myButton“.setDisable(true); seine Arbeit aber wie ich gelten Zeit-Logik für ihn.Ich versuchte Thread.Schlaf zur Zeit aber die ganze Anwendung hängt für eine bestimmte Zeit.Können Sie kleine Beispiel? in Kürze werde ich die update-code in Frage.
  4. 0

    Oder verwenden Sie einen Dienst und binden die running-Eigenschaft des disableProperty der Schaltfläche tun, die Sie deaktivieren möchten.

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

    Aber die Timeline-Lösung gegeben, die durch Uluk Biy, sieht mehr elegant.

Kostenlose Online-Tests

Letzte Fragen

Tun ItemView löst Blase?

Ich habe eine CompositeView für eine Tabelle. Ich habe Trigger-set in der Kind-ItemView für jede Zeile... var TableRow = Marionette.ItemView.extend({ tagName:...

Wie kann ich untersuchen, WCF was 400 bad request über GET?

Die folgenden WCF-endpoint funktioniert gut mit dem WCF test client: AssetList ListFlaggedAssets(short processCode, string platform, string endpoint = "null", string portalId = "null", int...

Bei der Verwendung von UUIDs, sollte ich auch mit AUTO_INCREMENT?

Wir bauen eine neue web-app, die eine offline-iPad - /Android-app-version auf einer Reihe von lokalen Geräten, die Einsätze mit neuen Daten. Als solche benötigen...

Actionscript-Objekt, das verschiedene Eigenschaften

Wie kann ich die Anzahl der Eigenschaften in einer generischen Actionscript-Objekt? (Wie die Array-Länge) InformationsquelleAutor Fragsworth | 2011-01-15

Wie plot mehrere Graphen und nutzen Sie die Navigations-Taste im [matplotlib]

Die neueste version von matplotlib erstellt automatisch Navigations-buttons unter den graph. Aber die Beispiele, die ich finden alles im Internet zeigen, wie erstellen Sie...