JavaFX样式类不会刷新

我正在为一个节点添加一个样式类,如果它被选中,如果我选择其他项目则将其删除。 即使我删除样式类,样式也不会刷新,所以它不会回到正常状态:

admin_category_label.getStyleClass().remove(admin_category_label.getStyleClass().indexOf("selected")); admin_category_label.getStyleClass().add("clear"); 

但风格将与所选的课程保持一致

这是一个错误。 据报道这里删除了hover的样式类,没有更新样式 。 您可能想投票并观看它。 作为一种解决方法,您应该覆盖您触摸/更改的css规则与默认规则相同。 演示:

 import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBoxBuilder; import javafx.stage.Stage; public class StyleDemo extends Application { @Override public void start(Stage primaryStage) { final Label lbl = new Label("Style Me"); lbl.getStyleClass().add("style1"); // initial style Button btn = new Button("Change the style"); btn.setOnAction(new EventHandler() { @Override public void handle(ActionEvent arg0) { lbl.getStyleClass().remove("style1"); lbl.getStyleClass().add("style2"); } }); StackPane root = new StackPane(); root.getChildren().add(VBoxBuilder.create().spacing(20).children(lbl, btn).build()); Scene scene = new Scene(root, 300, 250); scene.getStylesheets().add(this.getClass().getResource("style.css").toExternalForm()); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } } 

而style.css是:

 .style1 { -fx-text-fill: red; -fx-border-color: green; -fx-font-size: 20; } .style2 { -fx-text-fill: blue; -fx-border-color: red; -fx-font-size: 15; -fx-underline: true; } 

单击该按钮时,将删除最初添加的style1并添加style2

感谢Uluk Biy发布的解决方案。 但它似乎不是“按原样”工作(在jdk 1.70_40 win x 64上测试)。 我必须在设置类之前清除样式类。 这里是我的工作代码:

 import javafx.application.Application; import javafx.beans.property.BooleanProperty; import javafx.beans.property.SimpleBooleanProperty; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBoxBuilder; import javafx.stage.Stage; public class StyleDemo extends Application { //ADD just a toggle property public static BooleanProperty toggle = new SimpleBooleanProperty(false); @Override public void start(Stage primaryStage) { final Label lbl = new Label("Style Me"); lbl.getStyleClass().add("style1"); // initial style Button btn = new Button("Change the style"); btn.setOnAction(new EventHandler() { @Override public void handle(ActionEvent event) { //ADD clear style class ! lbl.getStyleClass().clear(); if(toggle.get()) { lbl.getStyleClass().add("style1"); toggle.set(!toggle.get()); }else{ lbl.getStyleClass().add("style2"); toggle.set(!toggle.get()); } } }); StackPane root = new StackPane(); root.getChildren().add(VBoxBuilder.create().spacing(20).children(lbl,btn).build()); Scene scene = new Scene(root, 300, 250); scene.getStylesheets().add("/style.css"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } } 

至少对于Java 8,现在可以使用了。 但是,不是做OP所做的,我会像这样做:

 admin_category_label.getStyleClass().remove("selected"); admin_category_label.getStyleClass().add("clear"); 

看起来更清洁。

请记住,您的CSS选择器需要如下所示:

 .selected { /* Styling attributes... */ } .clear { /* Styling attributes... */ } 

您可以尝试为应用程序添加css。 您甚至可以使用FXML将de design与应用程序的逻辑分开。 这是一段在JavaFX 2.1中适合我的代码!

 private Parent replaceSceneContent(String fxml) throws Exception { Parent page = (Parent) FXMLLoader.load( Main.class.getResource(fxml), null, new JavaFXBuilderFactory()); Scene scene = stage.getScene(); if (scene == null) { scene = new Scene(page, 1366, 720); scene.getStylesheets().add( Main.class.getResource( "../skinFolder/css/defaultSkin.css" ).toExternalForm()); stage.setScene(scene); } else { stage.getScene().setRoot(page); } stage.sizeToScene(); return page; } 

6年后,bug仍然存在,这里有一个更简单的方法,特别是如果你不想弄乱其他类:

 int indexOf = textField.getStyleClass().indexOf(INVALID_CLASS); if(indexOf != -1){ textField.getStyleClass().remove(indexOf); } 

为什么会这样? 因为用于StyleClass的TrackableObservablieList的列表inheritance了一个层次结构,其中remove(index)会触发remove(Object)不会触发的更改。