Как внедрить все вложенные контроллеры FXML за один раз? - PullRequest
2 голосов
/ 05 мая 2019

Я программирую приложение JavaFX, и мне нужно получить все контроллеры (кнопки, текстовые поля и палитру цветов) из моего представления.

Итак, я создал класс контроллера для загрузки всех контроллеров:

public class GeneralController extends BorderPane implements Initializable {

    @FXML private Button btnNew;
    @FXML private Button btnOpen;
    @FXML private Button btnSave;
    @FXML private Button btnShare;
    @FXML private Button btnHelp;
    @FXML private Button btnAbout;

    @FXML private ColorPicker clrSelectColor; 
    @FXML private Button btnPencil;
    @FXML private Button btnArrow;
    @FXML private Button btnCircle;
    @FXML private Button btnLine;
    @FXML private Button btnTriangle;
    @FXML private Button btnRectangle;
    @FXML private TextField nbcThickness;
    @FXML private Button btnConfirmThickness;

    @FXML private Button btnCropImg;
    @FXML private Button btnRotateImg;
    @FXML private Button btnInverseImg;

    @FXML private Canvas paintCanvas;
    private GraphicsContext gc;

    public GeneralController() {
        FXMLLoader fl = new FXMLLoader(getClass().getResource("/view/Window.fxml"));
         fl.setController(this);
         try {
             fl.load();            
         } catch (IOException exception) {
             throw new RuntimeException(exception);
         }

    }

Проблема в том, что после загрузки файла FXML все ссылки на мои контроллеры становятся нулевыми (конечно, из-за того, что контроллеры находятся во вложенных панелях).

Дерево файлов FXML находится здесь:

file tree

(Весь файл FXML: https://pastedb.io/paste/283be582-8624-4e13-71f8-838d6cbe15a7#fd3bdf271781a16f773b539ca30478f92ef7c8a9b228e7d630ee48c7eaf72a5f)

Как я могу загрузить все свои контроллеры (кроме панелей) без необходимости проходить через каждый вложенный контейнер? (Каждый контроллер имеет уникальный идентификатор для всего приложения).

1 Ответ

0 голосов
/ 07 мая 2019

Проблема в том, что самозагружаемый FXML настроен по-разному.

, поэтому необходимо добавить эту строку перед установкой контроллера:

fl.setRoot(this);

И внести изменения в FXML:

<fx:root type="javafx.scene.layout.BorderPane" xmlns:fx="http://javafx.com/fxml">
  <top />
  <center />
(...)
</fx:root>
...