Java 在一个主FXML中具有多个控制器的多个FXML

Java 在一个主FXML中具有多个控制器的多个FXML,java,javafx,javafx-8,fxml,scenebuilder,Java,Javafx,Javafx 8,Fxml,Scenebuilder,最近我开始学习JavaFX,现在有些事情困扰着我,我找不到解决“问题”的方法。我已经找到了类似的问题和解决类似问题的方法,但我找不到一个对我有效的方法,或者我做错了什么。我想做的是让一个主FXML文件具有自己的FXML控制器类。然后我想在主FXML中添加(导入)其他FXML文件,这些文件也有控制器。我尝试了几件事,但都不管用,所以我决定描述一下我在做什么。首先,我使用场景生成器创建主FXML文件,然后为主FXML创建控制器。然后,我在场景生成器中将主FXML的控制器类设置为主控制器(当然…)。之

最近我开始学习JavaFX,现在有些事情困扰着我,我找不到解决“问题”的方法。我已经找到了类似的问题和解决类似问题的方法,但我找不到一个对我有效的方法,或者我做错了什么。我想做的是让一个主FXML文件具有自己的FXML控制器类。然后我想在主FXML中添加(导入)其他FXML文件,这些文件也有控制器。我尝试了几件事,但都不管用,所以我决定描述一下我在做什么。首先,我使用场景生成器创建主FXML文件,然后为主FXML创建控制器。然后,我在场景生成器中将主FXML的控制器类设置为主控制器(当然…)。之后,我将对第二个FXML执行相同的操作。然后,我尝试将第二个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和LeftSceneControl,下面是第二个控制器的代码:

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) {    
} }
最后,这是main类,其中有main方法和start方法:

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代码,但系统出现问题,我不能发布多行代码

那么…有没有可能按照我的意愿来做呢


而且,如果你读了这些乱七八糟的东西,至少要感谢你抽出时间

已经有一段时间了,但我终于找到了问题的答案。我在YouTube上找到了视频,它正好显示了我所需要的。虽然我在一步一步地做视频中的事情时发现了一些问题

首先,如果我将另一个FXML文件导入到主FXML中(如本教程中所述),那么SceneBuilder将导入FXML,就像导入的FXML中的内容位于主FXML中一样,这会导致问题。我的意思是,例如,如果您在导入的FXML中有一个按钮,当您使用SceneBuilder在主FXML中导入它时,导入的按钮会像一个新按钮一样出现在主FXML中,包含它的所有信息(position、onClickMethod等),而不是它应该是什么样子。这会导致错误,因为Java正在主控制器中查找导入按钮的onClick方法,而不是在导入的FXML的控制器中。我不知道为什么我觉得它不一样,也不像视频中那样,但解决方法很简单。如果要将一个FXML文件导入另一个FXML,应使用编辑器,只需在主FXML的内容中添加以下行:

<fx:include fx:id="importedFXML" source="ImportedFXML.fxml" />
如果importedFXML控制器是importedFXML的控制器


所以,我希望这会对某些人有所帮助

为什么要在控制器中加载主场景?你读过了吗?是的,我读过嵌套控制器部分,这就是为什么我在两个控制器中都有构造函数。我的想法是在主控制器中使用第二个控制器(LeftSceneControl)对象,这样我就可以使用第二个控制器。这就是为什么第二个控制器正在加载场景,但可能这不是一个好主意,或者没有正确执行…为什么不按照文档中的方式执行呢?我想我发现了问题。我在文档中再次尝试了该方法,但这次没有使用SceenBuilder将第二个FXML导入主FXML,而是通过添加FXML文件及其正常工作来手动完成。现在的问题是,当我使用SceneBuilder打开主FXML时,我甚至无法更改导入的FXML文件的位置,因此我必须通过在编辑器中打开代码来手动完成。现在我只想知道我是不是对SceneBuilder做了什么错事,还是它只是一个bug。我不知道你在使用SceneBuilder。我很确定SceneBuilder不支持
@FXML private ImportedFXMLController importedFXMLController