我在一个fxml文件上有多个按钮.通过单击任何按钮,将显示在onAction中定义的fxml表单. 问题是:

我是应该加载所有的表单,比如Foreach,当按钮单击正确的表单时,我只显示它,还是不需要?

如果我要加载所有的表格,我应该在initialize函数中完成吗?

我是JavaFx岁的新手,不知道最好的方法是什么?

EDIT:

例如,当btn1点击表单添加用户将显示,当点击btn2表单删除用户将显示,...

问题是:

我是否应该加载添加用户表单和删除用户表单,...当程序启动时,例如,当BTN1单击添加用户表单时,是否显示?

<BorderPane fx:controller="com.project.controller.eventcontroller" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
   <left>
      <VBox  prefHeight="400.0" prefWidth="110.0" style="-fx-background-color: #404040;" BorderPane.alignment="CENTER">
         <children>
            <Button fx:id="btn1" alignment="TOP_LEFT" mnemonicParsing="false" prefHeight="17.0" prefWidth="111.0" text="btn1" />
            <Button fx:id="btn2" alignment="TOP_LEFT" layoutX="10.0" layoutY="10.0" mnemonicParsing="false" prefHeight="17.0" prefWidth="111.0" text="btn2">
               <VBox.margin>
                  <Insets top="12.0" />
               </VBox.margin>
            </Button>
            <Button fx:id="btn3" alignment="TOP_LEFT" layoutX="10.0" layoutY="47.0" mnemonicParsing="false" prefHeight="17.0" prefWidth="111.0" text="btn3">
               <VBox.margin>
                  <Insets top="12.0" />
               </VBox.margin>
            </Button>
            <Button fx:id="btn4" alignment="TOP_LEFT" layoutX="10.0" layoutY="84.0" mnemonicParsing="false" prefHeight="17.0" prefWidth="111.0" text="btn4">
               <VBox.margin>
                  <Insets top="12.0" />
               </VBox.margin>
            </Button>
         </children>
      </VBox>
   </left>
</BorderPane>

感谢所有人的帮助

推荐答案

推荐的方法

我的建议是:

  1. for each 按钮定义单独的操作处理程序,例如edit()delete().
  2. 使用@FXML注释将它们各自的onAction个处理程序注入到控制器代码中.
  3. 在FXML中,为按钮定义相应的onAction="#edit"onAction="#delete"属性.
  4. 在每个操作处理程序中,加载并显示新的FXML来处理操作的UI.

是的,您可以为其他地方的编辑和删除操作预加载FXML,然后在执行编辑和删除操作时只显示相应的 node ,但我不建议您这样做.

示例

好了,给你.

  1. 您已经定义了FXML文件edit.fxmldelete.fxml,用于处理编辑和删除功能的UI.
  2. 当请求动作时,您希望将当前场景根替换为动作的UI.
  3. 您的主应用程序类命名为MyApp.
  4. 与主应用程序类相同的包中有located as resources个FXML文件.

Code snippet for the controller handling the button actions

@FXML
private Button editButton;

@FXML
private Button deleteButton;

@FXML
private void edit(ActionEvent e) {
    editButton.getScene().setRoot(
        FXMLLoader.load(MyApp.class.getResource("edit.fxml"));
    );  
}

@FXML
private void delete(ActionEvent e) {
    deleteButton.getScene().setRoot(
        FXMLLoader.load(MyApp.class.getResource("delete.fxml"));
    );  
}

FXML snippet to interface with the controller

<Button fx:id="editButton" text="Edit" onAction="#edit" />
<Button fx:id="deleteButton" text="Delete" onAction="#delete" />

参考文献

以下是将操作处理程序分配给FXML中定义的按钮的示例:

共享数据

使用以下任一选项:

例如,您可以使用传递参数技术将要编辑的项的id传递给编辑控制器.

显示一个对话

如果要显示对话框而不是替换当前场景的内容,请执行以下操作:

@FXML
private void edit(ActionEvent e) {
    Scene editScene = new Scene(
        FXMLLoader.load(MyApp.class.getResource("edit.fxml"));
    );

    Stage owner = (Stage) editButton.getScene().getWindow(); 

    Stage editDialog = new Stage();
    editDialog.initOwner(owner);
    editDialog.initModality(Modality.APPLICATION_MODAL);
    editDialog.setScene(editScene); 
    editDialog.showAndWait();
}

根据需要调整stage设置.在本例中,我们创建了一个模式对话框.在允许用户再次与应用程序的其余部分交互之前,系统将等待用户完成与对话框的交互并关闭该对话框.

上面的代码使用标准的Stage,但您也可以使用Dialog类或子类.DialogAPI稍微复杂一些,也可能更难使用,我不在这里演示它的用法.

不相关的建议

  • 当您为事物指定ID值时,请使其有意义(而不是btn1btn2btn3等).

  • 你不需要将fx:id个值赋给你没有注入控制器的项(如果你觉得这会让你的应用程序更容易理解,你仍然可以这么做).

  • 为您的控制器指定一个有意义的名称和正确的大小写.例如,不是com.project.controller.eventcontroller,而是com.project.ActionMenu或其他适当的名称,具体取决于您的应用程序域中所需的函数.

  • 尽可能使用带有布局提示的layout panes,而不是硬编码首选大小和绝对布局定位.

Java相关问答推荐

Java字符串常数池困惑

Java中不同包中的类之间的配置共享

SQlite for Android无法使用json_group_array/json_object

Java中是否有某种类型的池可以避免重复最近的算术运算?

对于几乎不涉及逻辑的请求,您是否应该使用命令模式?

如何调整工作时间日历中的时间

对Java中的通配符参数的混淆

使用Spring Boot3.2和虚拟线程的并行服务调用

Bean定义不是从Spring ApplationConext.xml文件加载的

使SLF4J在Android中登录到Logcat,在测试中登录到控制台(Gradle依赖问题)

扩展视图高度,并将其拖动到较低的视图上,而不是将其向下推?

Android Java:已设置但未读取SharedPreferences

Android应用程序为错误的显示类型 Select 尺寸文件

如何在IntelliJ IDEA的Build.sbt中添加外部JAR文件?

为了安全起见,有必要复制一份 list 吗?

Java集合:NPE,即使没有添加空值

在ECLIPSE上的M1 Pro上运行JavaFX的问题

谷歌应用引擎本地服务器赢得';t在eclipse上运行

如何使用外部函数从Java中获取C++ struct 的返回值&;内存API

在JSON上获取反斜杠