我正在使用FXML创建自定义组件。自定义组件以分层方式设计。
当我设计一个使用另一个自定义组件A的自定义组件B时,在scenebuilder中会弹出一个类路径问题对话框,我只需通过设置相应的类路径来解决这个问题。
但是,当我创建三个组件时,比如包含B的C包含A,并尝试在Scenebuilder中打开顶级组件C,它会失败。它要求我提供我正式指定的类路径。它找到B但没有找到A.
类路径,FXML和代码是正确的,因为应用程序能够正确执行。只有Scenebuilder出现问题。
如何使用Scenebuilder打开分层自定义组件?
任何对使用FXML的分层组件定义的示例的引用都将非常感激,并获得50分的赏金。 (只需要3个级别)
答案 0 :(得分:0)
名叫大卫的人确实在论坛上回答了你的问题。 为了传统目的,我在这里发布。
Scene Builder中的类加载器存在自定义组件问题。 在SceneBuilder中加载FXML文件时:它使用带有自己的类加载器的FXMLLoader。 为了加载使用自己的FXMLLoader加载其他自定义组件的自定义组件,必须使所有FXMLLoader使用相同的类加载器。 正如David在论坛上所说,您可以通过在自定义组件中添加此代码来实现这一目标。
public class CustomC extends VBox {
public CustomC() {
init();
}
private void init() {
FXMLLoader loader = new FXMLLoader();
loader.setRoot(this);
loader.setLocation(this.getClass().getResource("CustomC.fxml"));
// Make sure to load "CustomC.fxml" with the same classloader that
// was used to load CustomC class.
loader.setClassLoader(this.getClass().getClassLoader());
try {
final Node root = (Node)loader.load();
assert root == this;
} catch (IOException ex) {
throw new IllegalStateException(ex);
}
}
}
如果要在类中外化此代码,将此类放在与自定义组件相同的jar中非常重要:您不能将它放在外部jar中(至少目前为止)。