JavaFX样式类不会刷新

时间:2012-06-04 20:00:22

标签: java css styles javafx fxml

我正在为节点添加样式类(如果已选中),然后在选择其他项目时将其删除。即使我删除了样式类,样式也不会刷新,所以它不会恢复正常状态:

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

但样式将与选择的类别保持一致

5 个答案:

答案 0 :(得分:15)

这是一个错误。据报道Removal of hovered style class, does not update styling。您可能想投票并观看它。作为一种解决方法,您应该覆盖您触摸/更改的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<ActionEvent>() {

            @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

答案 1 :(得分:1)

感谢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<ActionEvent>() {
            @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);
    }
}

答案 2 :(得分:1)

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

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

看起来更干净。

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

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

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

答案 3 :(得分:0)

您可以尝试为应用程序添加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;
}

答案 4 :(得分:0)

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

poMenu->exec(mapToGlobal(m_poMenuBar->rect().bottomLeft()));

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

相关问题