如何在JavaFX中创建按下运行按钮的按钮类型按钮?

时间:2015-01-05 00:02:29

标签: java user-interface javafx

基本上我试图在GUI上创建一个按钮,该按钮在按下时每0.5秒运行一些语句。目前我已经创建了名为" Next Generation"。

的实际按钮
Button nextGenButton = new Button("Next Generation");

在此之后我该怎么办?我假设我必须使用某种类型的事件处理程序?

2 个答案:

答案 0 :(得分:2)

结帐setOnMousePressedsetOnMouseReleased

您的代码看起来有点像这样:

final Button btn = new Button("Click me!");
btn.setOnMousePressed((event) -> {
    /**
     * Check if this is the first time this handler runs.
     * - If so, start a timer that runs every 0.5 seconds.
     * - If not, do nothing. The timer is already running.
     */
});
btn.setOnMouseReleased((event) -> {
    //Stop the timer.
});

请注意,按下按钮时会重复调用onMousePressed,因此您必须先检查它是否是第一次。

答案 1 :(得分:2)

您可以使用按钮的武装属性。不要使用鼠标或按键事件,否则您必须检查所有这些事件。检查动作事件不会对你有所帮助,因为它会被触发一次e。 G。鼠标被释放。随着武装财产你也覆盖e。 G。当按钮具有焦点时,当用户按下键盘上的空格键时,按钮被激活。

在按钮关闭时使用带有计数器的文本字段的示例:

public class ButtonDemo extends Application {

    // counter which increases during button armed state
    int counter = 0;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {

        // create textfield with the counter value as text
        TextField textField = new TextField();
        textField.setAlignment( Pos.CENTER_RIGHT);
        textField.setText( String.valueOf(counter));

        // timeline that gets started and stopped depending on the armed state of the button. event is fired every 500ms
        Timeline timeline = new Timeline(new KeyFrame(Duration.millis(500), actionEvent -> { counter++; textField.setText( String.valueOf(counter)); }));
        timeline.setCycleCount(Animation.INDEFINITE);

        // button which starts/stops the timeline depending on the armed state
        Button button = new Button( "ClickMe");
        button.armedProperty().addListener(new ChangeListener<Boolean>() {

            @Override
            public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {

                System.out.println( "armed: " + newValue);

                if( newValue) {

                    timeline.play();

                } else {

                    timeline.stop();

                }

            }
        });

        // container for nodes
        HBox hBox = new HBox();
        hBox.setSpacing(5.0);
        hBox.getChildren().addAll( button, textField);


        primaryStage.setScene(new Scene( hBox, 640, 480));
        primaryStage.show();
    }

}

请注意,我的示例中的事件每500ms触发一次。所以按钮必须至少下降500ms。如果您想在短按按下时触发事件,则必须在ChangeListener的实现中考虑这一点。这完全取决于你真正需要的东西。