我已经问过类似的问题here。答案是正确的,但似乎仍然不适用于我的情况。看一下我的代码:

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;

public class Main extends Application {

@Override
public void start(Stage primaryStage) throws Exception{
    FlowPane root = new FlowPane();
    root.setPadding(new Insets(40, 40, 40, 40));
    Button btn = new Button("NEW BUTTON");
    btn.setId("button");

    root.setOnKeyPressed(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent event) {
            btn.arm();
        }
    });

    root.setOnKeyReleased(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent event) {
            btn.disarm();
        }
    });

    root.getChildren().addAll(btn);
    primaryStage.setScene(new Scene(root, 310, 200));
    primaryStage.getScene().getStylesheets().add("style.css");
    primaryStage.show();
}


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


然后我指定了样式表:

#button {
-fx-background-color: #403e40;
-fx-border-width: 0;
-fx-font-size: 30px;
-fx-text-fill: #b3b1b3;
-fx-background-radius: 0;
}

#button:hover {
-fx-background-color: #595759;
}

#button:pressed {
-fx-background-color: #ffffff;
-fx-text-fill: #403e40;
}


最后,它不起作用。我绝对感到沮丧。如果未链接.css文件,则此方法工作正常,否则将不起作用。因此,如果以自定义视图按下某个键,是否有可能改变按钮的外观?

最佳答案

您可以创建自己的武装和解除武装风格。最初,您设置撤防样式,然后根据关键状态首先删除所有相关样式,然后设置撤防样式。像这样:

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        FlowPane root = new FlowPane();
        root.setPadding(new Insets(40, 40, 40, 40));
        Button btn = new Button("NEW BUTTON");
        btn.setId("button");
        btn.getStyleClass().add("disarmed");

        root.setOnKeyPressed(new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent event) {

                // remove existing styles
                btn.getStyleClass().remove("armed");
                btn.getStyleClass().remove("disarmed");

                // add new style
                btn.getStyleClass().add("armed");

                btn.arm();
            }
        });

        root.setOnKeyReleased(new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent event) {

                // remove existing styles
                btn.getStyleClass().remove("armed");
                btn.getStyleClass().remove("disarmed");

                // add new style
                btn.getStyleClass().add("disarmed");

                btn.disarm();

            }
        });

        root.getChildren().addAll(btn);
        primaryStage.setScene(new Scene(root, 310, 200));
        primaryStage.getScene().getStylesheets().add(getClass().getResource("style.css").toExternalForm());
        primaryStage.show();
    }

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


和CSS:

#button {
-fx-border-width: 0;
-fx-font-size: 30px;
-fx-text-fill: #b3b1b3;
-fx-background-radius: 0;
}

#button:hover {
-fx-background-color: #595759;
}

#button:pressed {
-fx-background-color: #ffffff;
-fx-text-fill: #403e40;
}

.armed  {
-fx-background-color: #ff0000;
}
.disarmed  {
-fx-background-color: #403e40;
}


请注意,如果您在ID选择器(#)中设置背景色,它将获得更高的优先级,并且无法覆盖它。

关于java - 按下键盘上的键时如何更改按钮的外观。 JavaFX,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31501629/

10-11 09:24