如何使用不同的fxml文件创建多个javafx控制器?

j w*_*ill 22 java controller javafx javafx-2 fxml

我一直在看一些博客和其他stackoverflow问题,我没有看到我的问题的直接答案.我正在创建一个javafx gui客户端,我希望我的菜单栏在一个fxml中是一个控制器,然后我希望内容区域是额外的fxml文件.登录屏幕将是一个fxml,登录屏幕将是应用程序的主要内容,并将在一个fxml中.我该怎么做呢?

我只是不想在同一个文件中拥有我的登录,菜单栏和主要内容的所有代码.这是我正在做的工作的图像:

在此输入图像描述

zen*_*eni 28

使用FXML作为组件,使用自定义java类作为fx:root和FXML文件的fx:controller:http://docs.oracle.com/javafx/2/fxml_get_started/custom_control.htm

为此,您需要调用自定义java类FXMLLoader的构造函数,该构造函数将加载您的FXML.优点是改变FXML加载组件的方式.

通过FXMLLoader与嵌套控制器实现组件实现组件的经典方法是:首先是FXML,然后是每个部件的控制器.

使用这种技术,首先是控制器,然后是每个组件的FXML.并且您不会直接在FXML中加载FXML,您将在FXML中导入自定义Java类.

这是一个更好的抽象(无需知道在FXML中导入组件时如何实现组件)并帮助重用代码,就像实现具有FXML支持的自定义小部件一样.要使组件可重用,请确保您的实现没有与其他部分紧密耦合,或使用IOC这样做(例如,使用Spring与JavaFX集成).这样,您就可以在应用程序的任何部分导入组件(就像DateInput小部件一样)而无需担心,您也不会重复代码.

在您的情况下,您将拥有:

public class MenuBox extends VBox {

@FXML
private LoginBox loginBox;

@FXML
private ProfilesBox profilesBox;

public MenuBox() {
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("menu.fxml"));
    fxmlLoader.setRoot(this);
    fxmlLoader.setController(this);
    try {
        fxmlLoader.load();
    } catch (IOException exception) {
        throw new RuntimeException(exception);
    }
}

public class LoginBox extends VBox {
public LoginBox() {
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("login.fxml"));
    fxmlLoader.setRoot(this);
    fxmlLoader.setController(this);
    try {
        fxmlLoader.load();
    } catch (IOException exception) {
        throw new RuntimeException(exception);
    }
}

public class ProfilesBox extends VBox {
public ProfilesBox() {
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("profiles.fxml"));
    fxmlLoader.setRoot(this);
    fxmlLoader.setController(this);
    try {
        fxmlLoader.load();
    } catch (IOException exception) {
        throw new RuntimeException(exception);
    }
}
Run Code Online (Sandbox Code Playgroud)

您将在menu.fxml中导入LoginBox和ProfilesBox,以管理页面的全局布局:

<?import com.foo.bar.LoginBox ?>
<?import com.foo.bar.ProfilesBox ?>
<fx:root type="javafx.scene.layout.VBox"
    xmlns:fx="http://javafx.com/fxml">

<!-- Stuff here to declare the menu bar-->

    <HBox>
       <ProfilesBox fx:id="profilesBox"/>
       <LoginBox fx:id="loginBox"/>
    </HBox>

</fx:root>
Run Code Online (Sandbox Code Playgroud)

login.fxml和profiles.fxml只包含基本组件.


Har*_*a R 5

  1. 您可以将FXML文档包含在另一个中 - 这可以帮助您分离设计逻辑

  2. 这意味着您可以拥有嵌套控制器 - 每个文档一个.

从文档中,您现在可以设置代码,以便逻辑可以分离,也可以从根控制器调用(如果需要).

希望有所帮助.

  • 我查看了嵌套控制器文档,如果我能看到include fxml中的内容,主控制器初始化方法中的内容以及对话框控制器的外观,我认为这将是非常有用的.我只是看不出精细细节是如何工作的. (2认同)