我有一个主窗体 (MainForm.fxml),它的控制器在 fxml 文件中定义。在同一个 fxml 文件中,我有 2 个包含在 fx:include 中的子表单(Subform1.fxml 和 Subform2.fxml)。Subform1 有一个具体的控制器。Subform2 是一个通用的“选择和编辑”表单,后面带有抽象代码。我想根据上下文显示具有抽象代码的不同具体实现的 Subform2。如果我在 fxml 中定义控制器,那么它将不再是通用的。
我只使用 FXMLLoader 来加载 MainForm,我找不到任何地方可以更改子窗体的控制器。我在房子周围走遍了尝试不同的东西。任何帮助将非常感激。
更新我的问题 感谢 James_D 迄今为止的帮助。我的 Subform1 在 fxml 文件中的定义:
<children>
<!--<fx:include source="Subform1.fxml" />-->
<!-- <Subform1 controller="${ISubform}" /> -->
<Subform1 controller="${Subform1Controller}" />
<!-- <Subform1 /> -->
</children>
我创建了一个如下界面:
package testsubforms;
public interface ISubform {
}
这是我的控制器:
package testsubforms;
public class Subform1Controller implements ISubform {
public Subform1Controller() {
System.out.println("Inside Subform1Controller");
}
}
以下是我的 Subform1 类:
package testsubforms;
import java.io.IOException;
import javafx.beans.NamedArg;
import javafx.fxml.FXMLLoader;
import javafx.scene.layout.GridPane;
public class Subform1 extends GridPane {
private ObjectProperty controller;
public ObjectProperty controllerProperty() {
return this.controller;
}
public void setController(Subform1Controller controller) {
this.controllerProperty().set(controller);
}
public Subform1(@NamedArg("controller") Subform1Controller controller) throws IOException {
this.controller = new SimpleObjectProperty(this, "controller", controller);
FXMLLoader loader = new FXMLLoader(getClass().getResource("Subform1.fxml"));
loader.setRoot(this);
loader.setController(controller);
loader.load();
}
public Subform1() throws IOException {
FXMLLoader loader = new FXMLLoader(getClass().getResource("Subform1.fxml"));
loader.setRoot(this);
loader.setController(this);
loader.load();
}
}
我当前的问题是运行时错误“javafx.fxml.LoadException:无法绑定到非类型化对象”,我在 fxml 文件中指定了 Subform1。任何帮助使拼图中的最后一块工作都将不胜感激。一旦我完成了最后一个工作,我将发布完整的示例供其他人使用。