当您想要创建可以使用场景生成器导入的自定义控件时,需要考虑一些事项。
什么是自定义控件
没有关于此的文档,但您可以查看当前的场景生成器中的源代码 https://github.com/gluonhq/scenebuilder/blob/master/kit/src/main/java/com/oracle/javafx/scenebuilder/kit/library/util/JarExplorer.java#L128探索 jar 中的所有类,并找到有效的类作为自定义控件:
- 类名不以
java.
, javax.
, javafx.
,
com.oracle.javafx.scenebuilder.
, com.javafx.
, com.gluonhq
.
- 具体类(非抽象类)
- 可分配自
Node
。这非常重要:该类应该是 JavaFX 节点的子类,就像一个容器(即从VBox
)或内置节点(即从Button
).
对于找到的所有类,将使用以下内容构建 FXML:
<?import your.class.fullname?>
<your.class.simplename />
如果该 FXML 可以由FXMLLoader
,那么它就是一个自定义控件。
否则将被丢弃。
自定义控件类型
关于如何构建自定义控件有多种方法,但如果您要使用 FXML 这个旧的方法tutorial https://docs.oracle.com/javase/8/javafx/fxml-tutorial/custom_control.htm给出了一些关于如何使用的重要说明fx:root
以及如何定义控制器,例如:
public class CustomControl extends VBox {
public CustomControl() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(
"custom_control.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}
...
}
Java 11 级别
最后,由于 Scene Builder 11 在 Java 11 上运行,因此必须在编译时支持 Java 11。
使用 Maven:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
在使用场景生成器之前,您可以在演示项目中尝试自定义控件。这将帮助您提前发现并解决可能出现的问题。
场景生成器 11
构建控件后,您可以打开场景生成器11 https://gluonhq.com/products/scene-builder/#download并按照以下命令导入它文档 https://docs.gluonhq.com/scenebuilder/#_library_manager.
基本上,使用该选项Add Library/FXML from file system
并浏览您的文件系统以找到该 jar。
注意:有一个合并公关 https://github.com/gluonhq/scenebuilder/pull/228这将允许使用项目的 build/target 目录,而不需要 jar。
如果是发布的自定义控件,您应该得到:
如果视图没有显示您的控件,则您必须首先解决一个问题。
注:还有待处理PR https://github.com/gluonhq/scenebuilder/pull/234当进程失败时,这将提供更多信息。