最近,我开始学习JavaFX,但有一些问题困扰着我,我找不到解决方法。虽然我找到了与我的问题类似的问题和一些解决方案,但是我没有找到一个适用于我的或者说我做错了什么。我想做的是在一个主FXML文件中添加(导入)其他具有控制器的FXML文件。我尝试了几种方法,但没有成功,因此我决定描述一下我的操作。首先,我使用Scene Builder创建了主FXML文件,然后创建了主FXML的控制器。然后我在Scene Builder中设置了主FXML的控制器类为主控制器。接下来,我为第二个FXML做同样的操作。然后我尝试将第二个FXML导入到主FXML中,如果我还没有为第二个FXML设置控制器,则可以正常工作。但是,如果我在导入之前为第二个FXML选择了控制器,则尽管我仍能够导入FXML文件并保存它,但运行程序后会出现错误。所以基本上我想做的是在一个具有控制器类的主FXML文件中添加多个具有自己控制器的FXML文件。我不确定这是否可能,所以请告诉我这是否可能,如果可能的话,我做错了什么。这是我的代码:
public class MainSceneController implements Initializable {
@FXML
private TextField mainTxtField;
public MainSceneController() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("MainScene.fxml"));
fxmlLoader.setController(this);
fxmlLoader.setRoot(this);
try {
fxmlLoader.load();
} catch (IOException exc) {
} }
@FXML
public void buttonActionMethod(ActionEvent event) {
mainTxtField.setText("Button1 is clicked");
}
@Override
public void initialize(URL location, ResourceBundle resources) {
} }
我将第二个FXML和第二个控制器命名为LeftScene和LeftSceneController,下面是第二个控制器的代码:
public class LeftSceneController implements Initializable {
@FXML
private TextField leftTxtField;
public LeftSceneController() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("MainScene.fxml"));
fxmlLoader.setController(this);
fxmlLoader.setRoot(this);
try {
fxmlLoader.load();
} catch (IOException exc) {
}
}
@FXML
public void button2Action(ActionEvent event) {
leftTxtField.setText("Button 2 is clicked");
}
@Override
public void initialize(URL location, ResourceBundle resources) {
} }
最后,这是MainClass,在其中包含主要方法和启动方法:
public class MainClass extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("MainScene.fxml"));
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.setTitle("Multiple FXMLs in one");
primaryStage.show();
} }
我希望你能明白我的意思。我尝试了很多方法,但都没有达到我想要的效果。如果在导入第二个FXML之前不设置第二个FXML的控制器类,那么这个版本是可以编译和运行的,但是正如你所料,从导入的FXML中的第二个按钮没有任何反应。如果可以的话,我会发布截图,但我是新手,通常只是阅读,所以我不能发布截图。我还尝试过发布我的FXML代码,但是系统出了问题,我无法发布超过一行代码。
那么...是否有可能让它按照我想要的方式工作呢?
如果您阅读了这篇混乱的文章,至少感谢您的时间! :)