JavaFX加载样式表
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
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">