把与构建场景或控制(视图)相关的所有逻辑放到单独的类中,然后用它来构建和分配适当的样式表,如何?
例如,在我的情况下,我创建了FXMLBuilder
类。它只是根据控制器类加载FXML,然后遍历控制器层次结构并应用与相应控制器相关的样式表。在文件系统中,我有以下层次结构:
|
+- controllers
| |
| +- BaseController.java
| +- BaseController.fxml
| +- BaseController.css
|
...
|
+- MyController.java (inherited from BaseController)
+- MyController.fxml
+- MyController.css
所以,当我构建MyController的实例时,
MyController myController = new MyController(...)
Parent myControllerRootNode = FXMLBuilder.build(myController)
...
这里是关于IT技术的翻译内容:应用程序从MyController.css和BaseController.css文件中应用样式表。
以下是我的FXMLBuilder
:
public class FXMLBuilder {
public static final String FXML_EXTENSION = "fxml";
public static final String CSS_EXTENSION = "css";
public static Parent build(Object controller) throws IOException {
Class<?> controllerClass = controller.getClass();
URL fxmlURL = getResourceURL(controllerClass, FXML_EXTENSION);
FXMLLoader fxmlLoader = new FXMLLoader(fxmlURL);
fxmlLoader.setControllerFactory(param -> controller);
Parent rootNode = fxmlLoader.load();
loadStylesheets(rootNode, controllerClass);
return rootNode;
}
private static void loadStylesheets(Parent rootNode, Class<?> controllerClass) {
Class<?> currentControllerClass = controllerClass;
while (!currentControllerClass.equals(Object.class)) {
if (getResourceURL(currentControllerClass, CSS_EXTENSION) != null) {
rootNode.getStylesheets().add(getResourcePath(currentControllerClass, CSS_EXTENSION));
}
currentControllerClass = currentControllerClass.getSuperclass();
}
}
public static String getResourcePath(Class<?> resourceClass, String extension) {
return String.format("/%s.%s", resourceClass.getCanonicalName().replace(".", "/"), extension);
}
public static URL getResourceURL(Class<?> resourceClass, String extension) {
return resourceClass.getResource(getResourcePath(resourceClass, extension));
}
}
我认为你可以编写类似以下代码的内容,它将加载适用于所有视图的基础样式表,然后加载指定视图的自定义样式表。
另外,最好从基础控制器开始迭代整个层次结构。