Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.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_Javafx_Stylesheet - Fatal编程技术网

JavaFX加载样式表

JavaFX加载样式表,java,css,javafx,stylesheet,Java,Css,Javafx,Stylesheet,JavaFX有一个添加到控制器的方法: public void初始化(URL,ResourceBundle-rb) 这似乎是在将任何控件添加到场景之前运行的,因为当我将其添加到场景中时: @Override public void initialize(URL url, ResourceBundle rb){ String treeItemCss = getClass().getResource("/media/css/TreeItem.css").getPath(); main

JavaFX有一个添加到控制器的方法:
public void初始化(URL,ResourceBundle-rb)

这似乎是在将任何控件添加到场景之前运行的,因为当我将其添加到场景中时:

@Override
public void initialize(URL url, ResourceBundle rb){
    String treeItemCss = getClass().getResource("/media/css/TreeItem.css").getPath();
    main.getScene().getStylesheets().add(treeItemCss);
}
CSS:

.tree-cell{
    -fx-indent: 100;
    -fx-underline: true;
}
我从这个方法中得到一个错误:
getStylesheets()
。但是,如果我将其移动到一个
操作
并执行该操作,则不会出现错误

所以我的问题是,有没有一种方法可以在所有控件都添加到场景后运行,或者有没有一种好的方法可以将css添加到从用户操作创建的项目中,例如单击按钮?

FXMLLoader
load()
方法的末尾运行
initialize()
方法。因为在完成之前,您不会获得对FXML根的引用,所以在此之前,显然无法将其添加到场景中

你可以:

在应用程序代码中将css添加到场景中。例如,在某处创建一个
fxmloader
,调用
load()
,并将结果添加到
场景中。只需在场景中设置css文件,或者:

将css样式表添加到根节点而不是场景(假设
main
Parent
):

或:

观察场景属性,并在样式表更改为非null时添加样式表:

public void initialize() {
    String treeItemCss = ... ;
    main.sceneProperty().addListener((obs, oldScene, newScene) -> {
        if (newScene != null) {
            newScene.getStylesheets().add(treeItemCss);
        }
    });
}
更新下面是一个完整的示例来演示第二个选项。所有内容都在“应用程序”包中:

Main.java:

package application;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;


public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            BorderPane root = FXMLLoader.load(getClass().getResource("Main.fxml"));
            Scene scene = new Scene(root,400,400);
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}
Main.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.control.TreeView?>
<?import javafx.scene.control.TreeItem?>

<BorderPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MainController" fx:id="root">
    <center>
    <TreeView>
        <root>
            <TreeItem value="Root">
                <children>
                    <TreeItem value="One"/>
                    <TreeItem value="Two"/>
                    <TreeItem value="Three"/>
                </children>
            </TreeItem>
        </root>
    </TreeView>
    </center>
</BorderPane>
application.css:

.tree-cell{
    -fx-indent: 100;
    -fx-underline: true;
}
请注意,您可以使用以下命令直接在FXML文件中添加样式表:

<BorderPane xmlns:fx="..." fx:controller="..." stylesheets="@application.css">


然后从控制器逻辑中完全忽略它。

main
是根
AnchorPane
,如果我将css附加到该根
AnchorPane
,我在css文件中放置的任何内容都会影响该
AnchorPane
?或者它也会影响它的所有子项?因此,如果它有
.tree单元格{-fx padding:1px;}
它会影响TreeView单元格吗?是的,样式将由子节点继承。好的,它正在加载,但出于某种原因它不会应用样式。我在我的主要问题中添加了样式表。这对我来说很好:请参阅更新。我在Java 1.8.0u20下运行。谢谢,这有助于解决错误!但这对css不被应用没有帮助。我将就此提出一个新问题。
.tree-cell{
    -fx-indent: 100;
    -fx-underline: true;
}
<BorderPane xmlns:fx="..." fx:controller="..." stylesheets="@application.css">