Как создать собственные компоненты JavaFX с использованием FXML, не вызывая предупреждения «this-escape»?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как создать собственные компоненты JavaFX с использованием FXML, не вызывая предупреждения «this-escape»?

Сообщение Anonymous »

Я пытаюсь создать собственные компоненты пользовательского интерфейса в JavaFX и использовать их в файле FXML. JavaFX предоставляет для этой цели тег fx:root, который позволяет установить пользовательский класс в качестве корневого компонента.
Согласно официальной документации 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();
}
}
}
И соответствующий файл fxml: Однако, когда я компилирую код с аргументами компилятора -Xlint:all и -Xlint:-processing, я получаю следующее предупреждение:

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»