gpt4 book ai didi

JavaFX 加载样式表

转载 作者:太空宇宙 更新时间:2023-11-04 12:41:00 25 4
gpt4 key购买 nike

JavaFX有一个添加到 Controller 的方法:
public void initialize(URL 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()。但是,如果我将其移至 OnAction 并执行该操作,我将不会出错。

所以我的问题是,是否有一种方法可以在将所有控件添加到场景后运行,或者是否有一种将 css 添加到根据用户操作(例如单击按钮)创建的元素的好方法?

最佳答案

initialize() 方法在 FXMLLoaderload() 方法结束时运行。由于在完成之前您不会获得对 FXML 根的引用,因此在此之前您显然无法将其添加到场景中。

您可以:

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

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

public void initialize() {
String treeItemCss = ... ;
main.getStylesheets().add(treeItemCss);
}

或:

观察 Scene 属性并在它更改为非空值时添加样式表:

public void initialize() {
String treeItemCss = ... ;
main.sceneProperty().addListener((obs, oldScene, newScene) -> {
if (newScene != null) {
newScene.getStylesheets().add(treeItemCss);
}
});
}

更新 下面是演示第二个选项的完整示例。一切都在“应用程序”包中:

主要.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);
}
}

主.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>

主 Controller .java:

package application;

import javafx.fxml.FXML;
import javafx.scene.layout.BorderPane;

public class MainController {
@FXML
private BorderPane root ;

public void initialize() {
root.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
}
}

应用程序.css:

.tree-cell{
-fx-indent: 100;
-fx-underline: true;
}

请注意,您可以直接在 FXML 文件中添加样式表

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

然后从 Controller 逻辑中完全省略它。

关于JavaFX 加载样式表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26874488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com