当前位置: 首页 > 知识库问答 >
问题:

场景生成器中的自定义控件ClassNotFoundException

温举
2023-03-14

我通过扩展现有控件创建了一个新控件,我希望在JavaFX场景中使用这个新控件。我希望能够使用Scene Builder编辑我的场景,但在将新控件添加到FXML文件后,我在打开Scene Builder时遇到ClassNotFoundException

例如,下面是我创建的一个类,它扩展了textfield:

RegexLimitingTextField.java

public class RegexLimitingTextField extends TextField {

    private String regexLimiter = ".*";

    public void setRegexLimiter(String regex) {
        this.regexLimiter = regex;
    }

    @Override
    public void replaceText(int start, int end, String text) {
        if (text.matches(regexLimiter))
            super.replaceText(start, end, text);
    }

    @Override
    public void replaceSelection(String replacement) {
        if (replacement.matches(regexLimiter))
            super.replaceSelection(replacement);
    }
}

将此控件添加到FXML文件后...

<?import javafx.scene.layout.GridPane?>
<?import sample.RegexLimitingTextField?>
<GridPane fx:controller="sample.Controller"
          xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
    <RegexLimitingTextField fx:id="textField" text="Test" />
</GridPane>
Caused by: java.lang.ClassNotFoundException: sample.RegexLimitingTextField
    at java.lang.ClassLoader.findClass(ClassLoader.java:530)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at javafx.fxml.FXMLLoader.loadTypeForPackage(FXMLLoader.java:2920)
    at javafx.fxml.FXMLLoader.loadType(FXMLLoader.java:2909)
    at javafx.fxml.FXMLLoader.importClass(FXMLLoader.java:2850)
    ... 23 more

为什么Scene Builder找不到我的新控件?我需要做什么才能让它找到并能够使用我的新控件?

如果需要,下面是其他文件:

main.java

public class Main extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setScene(new Scene(root, 200, 200));
        primaryStage.show();
    }
}

controller.java

public class Controller implements Initializable {
    public RegexLimitingTextField textField;

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        textField.setRegexLimiter("\\w*");
    }
}

共有1个答案

堵彬彬
2023-03-14

如果有人仍然因为SceneBuilder没有加载他们的自定义组件而遇到麻烦,那么只需传递一个类加载器就可以为我解决这个问题。

try {
    FXMLLoader loader = new FXMLLoader(getClass().getResource("CustomComponent.fxml"));
    loader.setRoot(this);
    loader.setController(this);
    loader.setClassLoader(getClass().getClassLoader());
    loader.load();
} catch (IOException e ){
    throw new RuntimeException(e);
}

功劳要归功于创造奇迹的人,那就是javaguy。

 类似资料:
  • 几个星期以来,我一直在想办法解决这个问题,现在我开始放弃了。我肯定做了什么根本错误的事情。不管怎样,这是我的情况。我以前用JavaFX做了一个简单的小程序,但现在发现了Scene Builder,并想用这个工具重新构建它。该项目包括几个经常重用的组件,如下面的组件。它由一个标签、一个滑块、一个文本字段和另一个自定义组件InfoIcon组成。 我已经了解到,在构建我称之为SliderVariable

  • 我使用一个fxml文件和一个Java类实现了一个自定义控件,类似于本官方教程中所解释的内容(参见下面的代码)。请注意,fxml根元素是用定义的,我以编程方式调用。 我尝试在应用程序的FXML布局中包含控件,应用程序加载良好(并按预期显示控件)。 但是,如果我尝试在Scene Builder 2.0中导入包含控件的jar文件,则该控件不会出现在要导入的组件列表中(与同一jar中的其他一些控件不同)。

  • 我的自定义类: 然后尝试添加这个自定义类,如下所示: 我已经尝试搜索这个错误,但没有找到任何解释为什么这不应该工作。我找到的示例表明,应该可以从control类扩展,并将其直接导入到fxml文件中,事实确实如此。当运行程序时,它的工作是完美的,这是场景构建器的问题。 我意识到这是一个Java版本问题,但整个项目设置为Java9(53),我尝试过更改版本,但没有成功。

  • 当我在一个舞台上工作时,我注意到我几乎有三次完全相同的东西。而不是那样(因为我讨厌那样),我决定把我有的3次,并把它变成一个自定义组件。 现在我知道我可以在代码中添加它,但我不能预测布局行为(其中两个将直接进入选项卡,第三个将进入网格窗格)。 我不想要的是: 这可能吗?我又从C#和VS2010中出来了,当涉及到自定义控件时,我有点被宠坏了,所以如果有可能让类似的事情发生,有人能告诉我怎么做吗? 是

  • 我现在在Scene Builder中打开了项目,并在anchor窗格中添加了一个controller类,它为我自动完成了该窗格,因为它识别出我有一个controller类,并且看起来正确。 但是,当我返回到我的.fxml文件时,它将我的控制器标签用红色表示为错误,并表示还表示 我该怎么做呢?我完全按照教程... 项目文件结构如下: ProjectX>src>ProjectX(包)>controll

  • 我希望此图表显示在场景生成器上。怎么可能。。??