Как привязать контроллер внутреннего класса к FXML?

Я хочу привязать контроллер внутреннего класса "FinishDialogController" к FXML. Это настоящая загадка.

Но fx:controller="app.view.MainLayoutController.FinishDialogController" ошибается.

Кто знает правильный путь?

Я ищу «внутренний» в Введение в FXML, но не найдено.

это полный FXML:

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane prefHeight="108.0" prefWidth="350.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="app.view.MainLayoutController.FinishDialogController">
   <children>
      <TextField fx:id="textField" layoutX="25.0" layoutY="50.0" onAction="#handleTextField" prefHeight="23.0" prefWidth="314.0" AnchorPane.leftAnchor="25.0" AnchorPane.rightAnchor="25.0" />
      <Button fx:id="okButton" layoutX="219.0" layoutY="78.0" mnemonicParsing="false" onAction="#handleOkButton" text="OK" />
      <Button fx:id="deleteButton" layoutX="271.0" layoutY="78.0" mnemonicParsing="false" onAction="#handleDeleteButton" text="Delete" />
   </children>
</AnchorPane>


person Andy    schedule 07.11.2019    source источник
comment
попробуйте с $ для разделителя app.view.MainLayoutController$FinishDialogController.   -  person mr mcwolf    schedule 07.11.2019
comment
@mr mcwolf Спасибо за ваш ответ. Звучит как хорошая идея, но это не решает мою проблему.   -  person Andy    schedule 07.11.2019
comment
Ваш внутренний класс static? Не-static внутренние классы не могут быть инициализированы FXMLLoader без controllerFactory, так как их конструкторы имеют скрытый дополнительный параметр в начале списка параметров: экземпляр окружающего класса. Это public? FXMLLoader не инициализирует классы, отличные от public.   -  person fabian    schedule 07.11.2019
comment
@fabian спасибо за ответ, я решил свою проблему.   -  person Andy    schedule 08.11.2019


Ответы (1)


Звучит как хорошая идея, но это не решает мою проблему.

Что это значит? в чем именно проблема?:

public class Parent {
    public static class Child {

        @FXML
        private Label label;

        @FXML
        private void initialize() {
            System.out.println("initialize " + getClass().getName());
            System.out.println("label =  " + label);
        }
    }
}

<AnchorPane xmlns="http://javafx.com/javafx"
            xmlns:fx="http://javafx.com/fxml"
            fx:controller="sample.Parent$Child">

    <Label fx:id="label" text="Test"/>

</AnchorPane>

public class Sample extends Application {

    public void start(Stage stage) throws Exception {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("/sample/test.fxml"));

        Parent root = loader.load();
        Scene scene = new Scene(root, 400, 200);

        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

При запуске приведенного выше примера контроллер успешно инициализируется:

initialize sample.Parent$Child
label =  Label[id=label, styleClass=label]'Test'
person mr mcwolf    schedule 07.11.2019
comment
Спасибо. Когда я удаляю заявление OnActive, проблема была решена. Сейчас я использую лямбда-выражение deleteButton.setOnAction(this::handleDeleteButton). - person Andy; 08.11.2019