Согласно официальной документации Oracle для JavaFX 8 (хотя Мне не удалось найти обновленную документацию для JavaFX 23), пользовательский компонент можно создать путем наследования от стандартного элемента управления JavaFX (например, VBox или AnchorPane). Конструктор класса кода программной части может загрузить файл FXML с помощью FXMLLoader, а корневой элемент и класс контроллера задаются внутри конструктора.
Вот минимальный пример. кода, который я использую:
Код: Выделить всё
public class CustomAnchorPane extends AnchorPane {
public CustomAnchorPane() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("customAnchorPane.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Код: Выделить всё
Код: Выделить всё
warning: [this-escape] possible ‘this’ escape before subclass is fully initialised
fxmlLoader.setRoot(this);
- Сделать класс окончательным, но это предотвращает создание подклассов .
- Логика FXMLLoader перемещена из конструктора, но я не знаю, как затем связать файл FXML с пользовательским компонентом.
Как создать собственный компонент JavaFX, который загружается через FXML, не вызывая предупреждения «this-escape», сохраняя при этом возможность подклассификации компонента?
Дополнительная информация:
Вот пример приложения о том, как я пытаюсь загрузить компонент:
Код: Выделить всё
package com.example.javafxissue;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class HelloApplication extends Application {
@Override
public void start(Stage stage) {
Scene scene = new Scene(new CustomAnchorPane(), 320, 240);
stage.setTitle("Hello!");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
- Версия JavaFX: 23
- Компилятор: javac с опциями -Xlint:all и Xlint:-processing >
Подробнее здесь: https://stackoverflow.com/questions/793 ... this-escap
Мобильная версия