java - 一个 Main FXML 中具有多个 Controller 的多个 XML

标签 java javafx javafx-8 fxml scenebuilder

最近我开始学习 JavaFX,现在有些事情困扰着我,我找不到解决我的“问题”的方法。我发现了类似的问题和一些解决方案来解决像我这样的问题,但我找不到适合我的,或者只是我做错了什么。我想要做的是拥有一个具有自己的 FXML Controller 类的主 FXML 文件。然后我想在主 FXML 中添加(导入)其他也有 Controller 的 FXML 文件。我尝试了几件事,但没有任何效果,所以我决定描述我在做什么。首先,我使用 Scene Builder 创建主 FXML 文件,然后为主 FXML 创建 Controller 。然后我在 Scene Builder 中将 Main FXML 的 Controller 类设置为主 Controller (当然……)。之后我对第二个 FXML 做同样的事情。然后我尝试将第二个 FXML 导入到 Main FXML 并且它工作正常,如果我没有为第二个 FXML 设置 Controller 。但是,如果我在将第二个 FXML 导入到主 FXML 之前为它选择了一个 Controller ,我仍然能够导入 FXML 文件并保存它,但是在我尝试运行该程序之后,我收到了一个错误。所以基本上我想做的是在一个主 FXML 文件中有多个 FXML 文件和它们自己的 Controller ,它也有一个 Controller 类。我完全不确定这是否可能,所以请告诉我这是否可能,如果可能的话,我做错了什么。这是我的代码:

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 和第二个 Controller LeftScene 和 LeftSceneController,所以这里是第二个 Controller 的代码:

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,其中有 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 设置 Controller 类,这个版本正在编译和运行,但正如您所料,导入的 FXML 中的第二个按钮没有做任何事情。如果可以的话,我会发布屏幕截图,但我是新来的,通常我只是在阅读,所以我不允许发布屏幕截图。我也尝试发布我的 FXML 代码,但我遇到了系统问题,我无法发布超过一行的代码。

那么……是否可以按我想要的方式进行这项工作?

另外,如果您阅读了所有这些乱七八糟的内容,至少感谢您的宝贵时间! :)

最佳答案

已经有一段时间了,但我终于找到了问题的答案。我找到了 this YouTube 上的视频,它显示的正是我所需要的。尽管我在逐步执行视频中的操作时发现了一些问题。

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

<fx:include fx:id="importedFXML" source="ImportedFXML.fxml" />

在这种情况下重要的是 fx:id 应该与 .FXML 文件同名,但首字母小。

另一件事,在视频中展示并引起了我的问题,如果您想要多个导入的 FXML 文件并且您希望它们相互通信。该视频展示了如何执行此操作,但并未提及您必须在 MainController 中创建的导入 FXML 文件的 Controller 对象必须具有相同的名称,如 fx:id + Controller 一词。例如上面的 fx:id,对象应该是这样的:

@FXML private ImportedFXMLController importedFXMLController 

如果 ImportedFXMLController 是导入的 FXML 的 Controller

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

关于java - 一个 Main FXML 中具有多个 Controller 的多个 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29348427/

相关文章:

java - 'TAG' 在 'android.support.v4.app.FragmentActivity' 具有私有(private)访问权限

java - 如何将CellValueFactory设置为javafx中各种属性的函数?

java - JavaFX线程中的“异步while循环”

java - 将图像上的两个点映射到另一个点

java - JavaFx 中的 CubicCurve 和 CubicCurveTo

java - 如何在CompilationUnit中获取有关导入的问题

java - Java 中的包初始化

java - 将 JSONObject 转换为 JSONArray 异常

Javafx onMouseclicked 上

JavaFX KeyEvent 和重音字符