gpt4 book ai didi

java - 如何使用不同的 fxml 文件创建多个 javafx Controller ?

转载 作者:IT老高 更新时间:2023-10-28 20:40:25 25 4
gpt4 key购买 nike

我一直在查看一些博客和其他 stackoverflow 问题,但我没有看到我的问题的直接答案。我正在创建一个 javafx gui 客户端,我想让我的菜单栏成为一个 fxml 中的一个 Controller ,然后我希望内容区域是其他 fxml 文件。登录屏幕将是一个 fxml,在登录屏幕之后将是应用程序的主要内容,这将是一个 fxml。我该怎么做呢?

我只是不想将登录名、菜单栏和主要内容的所有代码都放在同一个文件中。这是我正在处理的图像:

enter image description here

最佳答案

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

为此,您需要调用自定义 java 类 FXMLLoader 的构造函数,它将加载您的 FXML。好处是改变了FXML加载组件的方式。

使用嵌套 Controller 通过 FXMLLoader 实例化组件的经典方法是:首先是 FXML,然后是每个部分的 Controller 。

使用这种技术是:首先是 Controller ,然后是每个组件的 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);
}
}

您将在 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>

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

关于java - 如何使用不同的 fxml 文件创建多个 javafx Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19342259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com