Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX样式的类不会刷新_Java_Css_Styles_Javafx_Fxml - Fatal编程技术网

JavaFX样式的类不会刷新

JavaFX样式的类不会刷新,java,css,styles,javafx,fxml,Java,Css,Styles,Javafx,Fxml,如果选择了某个节点,则将其添加到该节点,如果选择了其他项,则将其删除。即使删除样式类,样式也不会刷新,因此不会返回正常状态: admin_category_label.getStyleClass().remove(admin_category_label.getStyleClass().indexOf("selected")); admin_category_label.getStyleClass().add("clear"); 但是样式将保持与所选类相同您可以尝试为应用程序添加css。甚至可

如果选择了某个节点,则将其添加到该节点,如果选择了其他项,则将其删除。即使删除样式类,样式也不会刷新,因此不会返回正常状态:

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

但是样式将保持与所选类相同

您可以尝试为应用程序添加css。甚至可以使用FXML将反设计与应用程序的逻辑分离。下面是一段在JavaFX2.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;
}

这是一个错误。据此间报道。你可能想投票并观看。作为一种解决方法,您应该覆盖您接触/更改的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);
    }
}

单击按钮时,最初添加的样式1被删除,样式2被添加。

感谢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);
    }
}

至少对于Java8来说,现在可以这样做了。但我不会像OP那样做,我会像这样做到:

admin_category_label.getStyleClass().remove("selected");
admin_category_label.getStyleClass().add("clear");
.selected {
    /* Styling attributes... */
}

.clear {
    /* Styling attributes... */
}
看起来干净一点

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

admin_category_label.getStyleClass().remove("selected");
admin_category_label.getStyleClass().add("clear");
.selected {
    /* Styling attributes... */
}

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

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

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

为什么会这样?因为样式类(TrackableObservableList)所使用的列表继承自一个层次结构,在该层次结构中,removeindex会触发removeObject不会触发的更改。

在某些JavaFX版本中,样式类管理存在一些bug。在a中重试测试,看看是否仍然存在问题。这不是最好的解决方案,因为我必须重写所有规则才能更改它们,它们不会自动重置为默认或其他类。但它是有效的。谢谢你不用重写了。因为样式选择器是按照它们出现的顺序一个接一个地应用的。例如,如果我删除了样式1,但没有在单击按钮时添加样式2,那么标签将保留其在内置caspian.css中定义的默认样式。忘记我以前的注释。我现在明白你的意思了。