如何按下键盘上的按键时更改按钮的外观。 JavaFx

问题描述:

我已经问了类似的问题here。答案是正确的,但似乎它不适用于我的情况。看看我的代码:如何按下键盘上的按键时更改按钮的外观。 JavaFx

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选择器(#)的背景颜色,将获得更高的优先级,你不能覆盖它。