JavaFX:使按钮看起来像被点击一样

时间:2016-01-24 17:18:04

标签: java button javafx

我的应用程序中有一个按钮。单击它会产生与按某个键完全相同的操作。所以我希望如果用户按下键,按钮看起来就像被点击一样,即短时间变暗然后再次恢复正常。所以,在我的密钥处理程序中,我写道:

xBall < canvas.width-10 && xBall > canvas.width-30

会导致触发一个动作事件,但不会显示在单击按钮的按钮中。我怎样才能完成后者?

4 个答案:

答案 0 :(得分:3)

您可以使用myButton.arm(...)myButton.disarm()来“释放”它。

由于您可能希望它暂停一段时间,然后似乎已被释放,因此您需要以下几行:

myButton.arm();
PauseTransition pause = new PauseTransition(Duration.seconds(0.5));
pause.setOnFinished(e -> myButton.disarm());
pause.play();

如果您想要在发布时实际触发事件,请在致电myButton.fire()时致电disarm()

pause.setOnFinished(e -> {
    myButton.disarm();
    myButton.fire();
});

这是一个SSCCE。如果按“向上”键(即向上光标键),则模拟按下按钮:

import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.PauseTransition;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Duration;

public class PrgorammaticallyPressButton extends Application {

    @Override
    public void start(Stage primaryStage) {
        IntegerProperty count = new SimpleIntegerProperty();
        Label label = new Label();
        label.textProperty().bind(count.asString("Count: %d"));

        Button button = new Button("Increment");
        button.setOnAction(e -> count.set(count.get()+1));



        VBox root = new VBox(5, label, button);
        root.setAlignment(Pos.CENTER);
        Scene scene = new Scene(root, 350, 150);

        scene.addEventFilter(KeyEvent.KEY_PRESSED, e -> {
            if (e.getCode() == KeyCode.UP) {
                button.arm();
                PauseTransition pause = new PauseTransition(Duration.seconds(0.5));
                pause.setOnFinished(evt -> {
                    button.disarm();
                    button.fire();
                });
                pause.play();
            }
        });

        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

答案 1 :(得分:0)

定义EventHandler

EventHandler evtHandler = event -> {
  System.out.println("Execute event");
}

然后将事件处理程序的相同实例指定为按钮的处理程序并从KeyEventListener委托给该事件,因为您可能想要区分按下了哪个键:

EventHandler<KeyEvent> keyEventHandler = event -> {
        if (event.getCode().equals(KeyCode.F) && event.isControlDown()) {
            evtHandler.handle(event);
        }
};

答案 2 :(得分:0)

在按钮setAction上尝试此操作,

logIn.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            final Color startColor = Color.web("#000000");
            final Color endColor = Color.web("#FFFFFF");
            final ObjectProperty<Color> color = new SimpleObjectProperty<Color>(startColor);
              final Timeline timeline = new Timeline(
                      new KeyFrame(Duration.ZERO, new KeyValue(color, startColor)),
                      new KeyFrame(Duration.seconds(1), new KeyValue(color, endColor)));

              final StringBinding cssColorSpec = Bindings.createStringBinding(new Callable<String>() {
                  @Override
                  public String call() throws Exception {
                      return String.format("-fx-body-color: rgb(%d, %d, %d);", 
                              (int) (256*color.get().getRed()), 
                              (int) (256*color.get().getGreen()), 
                              (int) (256*color.get().getBlue()));
                  }
              }, color);
            logIn.styleProperty().bind(cssColorSpec);
             timeline.play();
        }
    });

答案 3 :(得分:-1)

你想使用myButton.doClick();,这会模拟被点击的按钮,而不仅仅是被触发的按钮动作。对于javafx按钮,使用arm()和disarm()以及fire()。此页面解释了更多https://community.oracle.com/thread/2564393?start=0&tstart=0