FXML: класснотфаундексцептион

Я новичок в JavaFX, и у меня возникли проблемы с использованием собственного класса в FXML. Консоль продолжает выдавать мне это исключение при попытке загрузить main.fxml:

... 1 more
Caused by: java.lang.ClassNotFoundException: sample.View$BoardPane
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
...

Я создал класс BoardPane как подкласс FlowPane в пакете sample.View и сослался на него в своем FXML следующим образом:

<?import sample.View.BoardPane?>
...
<TitledPane expanded="true" collapsible="false" text="BoardPane" fx:id="centerTitledPane">
    <BoardPane fx:id="mechoBoardPane"/>
</TitledPane>
...

и структура проекта выглядит так:

  • resources
    • fxml
      • main.fxml
  • ...
  • src
    • ...
    • sample
      • ...
      • View
        • BoardPane

Может ли кто-нибудь помочь мне в этом? Я искал некоторое время и не нашел никакого объяснения.


person Tengyu Liu    schedule 17.06.2015    source источник
comment
вы можете попробовать использовать <?import sample.View.BoardPane.*?> с .* или <?import sample.View.*?>   -  person varren    schedule 17.06.2015
comment
@varren Я пробовал оба, и они не помогли :(   -  person Tengyu Liu    schedule 17.06.2015


Ответы (1)


Имя пакета «Вид» должно быть в нижнем регистре. В вашем проекте, так же как и в файле fxml.

Подробнее см. метод loadType класса FXMLLoader.class:

private Class<?> loadType(String name, boolean cache) throws ClassNotFoundException {
    int i = name.indexOf('.');
    int n = name.length();
    while (i != -1
        && i < n
        && Character.isLowerCase(name.charAt(i + 1))) {  // <<<<<<<<<
        i = name.indexOf('.', i + 1);
    }

    if (i == -1 || i == n) {
        throw new ClassNotFoundException();
    }

    String packageName = name.substring(0, i);
    String className = name.substring(i + 1);

    Class<?> type = loadTypeForPackage(packageName, className);

    if (cache) {
        classes.put(className, type);
    }

    return type;
}
person Roland    schedule 17.06.2015
comment
Почему это ограничение было наложено на FXMLLoader? - person Mitch Talmadge; 25.12.2015
comment
Это решило проблему для меня. Странно, что это ограничение накладывается на имена пакетов при создании пользовательских компонентов и встраивании их в файлы .fxml, но это не имеет значения, если вы используете включение стиля <fx:include fx:id="name" source="filename.fxml"/>. - person gbmhunter; 25.08.2016