我已经问过类似的问题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/