Внедрение FXML в производный класс FX (контроллер) из базового класса работает, но почему?
Код, приведенный ниже, действительно работает.Но мне любопытно, почему?
FXML загружается в конструктор абстрактного базового класса (FXMLPopup) и внедряется в производный класс (TestfxmlController).
Моя проблема: когда базовый класссоздается (и вводится fxml), производный класс еще не создан.Также imho, база не должна ничего знать о производном классе, не так ли?
Кроме того, поле, которое должно быть введено, является частным в производном классе!Таким образом, загрузчик должен сделать его доступным, но в базе нет @FXML, который бы позволил сделать это (разрешение дано только в производном классе, который еще не был создан - Ну, поле вообще не существуетв базе!).
Тем не менее, FXML правильно вводится в производный класс - и поля фактически являются теми, которые находятся в производном классе.Почему это работает?
Базовый класс:
public abstract class FXMLPopup extends Popup implements Initializable {
@SuppressWarnings("LeakingThisInConstructor")
public FXMLPopup(String filename) {
super();
final FXMLLoader loader = new FXMLLoader(FXMLLoader.class.getResource(filename));
//if a controller is set in the fxml, ignor it.
loader.setControllerFactory(p -> this);
try {
this.getContent().add(loader.load());
} catch (IOException ex) { }
}
}
Производный класс:
public class TestfxmlController extends FXMLPopup {
@FXML
private ChoiceBox<String> testChoiceBox;
public TestfxmlController() {
super("fxml/testfxml.fxml");
}
@Override
public void initialize(URL url, ResourceBundle rb) {
//works!!!!
testChoiceBox.getItems().add("test");
}
}
FXMLCode:
<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/11.0.1" fx:controller="TestfxmlController">
<children>
<ChoiceBox fx:id="testChoiceBox" layoutX="113.0" layoutY="160.0" prefWidth="150.0" />
</children>
</AnchorPane>
Что бы я ожидал?Я ожидал бы ошибок над ошибками.То, что загрузчик не находит поля в базовом классе, и что доступ запрещен .... Но это как-то magicaly работает безупречно.Несмотря на то, что я нарушаю все возможное в таком маленьком примере.Я хотел бы понять "магию" за этим ...