Пользовательский элемент управления JavaFX (TextField) не работает

Я пытаюсь создать настраиваемый элемент управления с помощью JavaFX и SceneBuilder 1.1.

У меня есть этот код:

FXML


<?import libreria.javaFX.componentes.componenteTextField.*?>

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml">
  <children>
    <CustomComponent fx:id="pastaTxt" layoutX="69.0" layoutY="87.0" prefWidth="200.0" />
  </children>
</AnchorPane>

CustomComponent.java


package libreria.javaFX.componentes.componenteTextField;

import javafx.scene.control.TextField;

public class CustomComponent extends TextField {

public CustomComponent() {
    super();
    // TODO Auto-generated constructor stub
}

public CustomComponent(String arg0) {
    super(arg0);
    // TODO Auto-generated constructor stub
}

}


Когда я пытаюсь открыть его из SceneBuilder, он говорит мне следующее:

Отсутствующие типы: [CustomComponent]

и это дает мне возможность указать путь к классу (который также не устраняет проблему).

Я попытался поместить класс в оператор импорта, например:

<?import libreria.javaFX.componentes.componenteTextField.CustomComponent?>

Но он дает ClassNotFoundException.

Любые идеи о том, почему это происходит?


ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

Я сделал новый проект только с этими классами:

enter image description here

И код выглядит следующим образом:

CustomControl.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import custom.CustomControl?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<?scenebuilder-classpath-element ../../bin/custom?>

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml">
  <children>
    <CustomControl layoutX="51.0" layoutY="100.0" prefWidth="200.0" />
  </children>
</AnchorPane>

CustomControl.java

package custom;

import javafx.scene.control.TextField;

public class CustomControl extends TextField {

    public CustomControl() {
        super();
    }

public CustomControl(String arg0) {
    super(arg0);

    }
}

И у меня все та же проблема. Я указываю путь к классу с диалогом, все кажется мне правильным, но у меня такие же ошибки, что и открытие SceneBuilder.


ПОСЛЕДНЯЯ ИНФОРМАЦИЯ

Пытаясь подойти к решению, мы пробовали этот проект под Eclipse. В результате Eclipse показывает окно ok, но SceneBuilder продолжает эти ошибки. Я надеюсь, что эта подсказка поможет.

Если кто-либо сделал это определение пользовательского контроля в Scene Builder, пожалуйста, сообщите нам и дайте нам пример, это будет очень полезно для нашего проекта.

Ответ 1

Это вызвано не указанием правильного пути к классам, который позволяет java runtime запускать сценарий для загрузки классов управления.

Если вы используете eclipse, а ваш класс имеет пространство имен custom.MyControl, укажите каталог bin, а не настраиваемый каталог. В проекте maven вам нужно указать каталог target/classes.

См. пример в моем собственном проекте здесь: https://bitbucket.org/atill/estimate/src/22390a2ca034b55f1916e46435b714e5c489b90e/src/main/resources/projmon/gui/workTree.fxml?at=master

Относительный путь к файлу часто создается компоновщиком сцен, поэтому движущиеся файлы нарушают путь к классу, и вам необходимо его отреагировать.

Ответ 2

Возможно, поздно, но я хотел бы рассказать, что я сделал. Я использую J8, Eclipse IDE и Scenebuilder 2.0.

1) В Eclipse IDE откройте окно "Навигатор" из окна " > " Показать вид " > " Навигатор "2) В вашем проекте щелкните правой кнопкой мыши и выберите" Свойства "в классе, который вы хотите увидеть на SB (Scene Builder). Проверьте местоположение сгенерированного класса в разделе" Ресурсы". Например, вы увидите местоположение, как показано ниже. /TableViewDemo/bin/com/company/jfx 8/example/fxmltableview/FormattedTableCellFactory.class

3) Скопируйте этот адрес и добавьте fxml, например

<?scenebuilder-classpath-element ../../../../TableViewDemo/bin/com/company/jfx8/example/fxmltableview/FormattedTableCellFactory.class?> 

4) Затем сохраните его и наслаждайтесь своей работой:)