将 FXML 注入从基类派生的 FX 类(控制器)中有效 - 但为什么呢?
下面的代码实际上是有效的。但我很好奇为什么?
FXML 在抽象基类 (FXMLPopup) 的构造函数中加载并注入派生类 (TestfxmlController)。
我的问题:当基类被构造(并且 fxml 被注入)时,派生类还没有被构造。另外恕我直言,基础不应该对派生类一无所知,不是吗?
此外,要注入的字段在派生类中是私有的!因此加载器必须使其可访问,但基础中没有@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");
}
}
FXML代码:
<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>
我会期待什么?我希望错误超过错误。加载器没有找到基类中的字段并且访问被拒绝......但它以某种方式神奇地完美无瑕。尽管我在这样一个小例子中尽可能地违反了一切。我想了解这背后的“魔力”……