User interface 具有多个页面的Javafx应用程序

User interface 具有多个页面的Javafx应用程序,user-interface,javafx,panels,User Interface,Javafx,Panels,我有一个关于在javafx中构建gui的问题 当我构建一个包含许多页面的程序时,我的意思是,例如,开始页面包含两个按钮“添加用户”、“删除用户”、“更改用户数据”——每个按钮都会绘制一个不同的面板。这是我的问题——如何组织它们。 当我把所有面板放在一个类中时,它会迅速变大并产生许多bug。也很难找到一部分代码被破坏了。 是否应在不同的类中定义每个面板?但如果是这样的话,从子菜单返回主菜单就会出现问题 或者另一个例子。程序的第一个面板是登录页面,下一个页面取决于插入的登录 我应该如何组织大量的小组

我有一个关于在javafx中构建gui的问题

当我构建一个包含许多页面的程序时,我的意思是,例如,开始页面包含两个按钮“添加用户”、“删除用户”、“更改用户数据”——每个按钮都会绘制一个不同的面板。这是我的问题——如何组织它们。 当我把所有面板放在一个类中时,它会迅速变大并产生许多bug。也很难找到一部分代码被破坏了。 是否应在不同的类中定义每个面板?但如果是这样的话,从子菜单返回主菜单就会出现问题

或者另一个例子。程序的第一个面板是登录页面,下一个页面取决于插入的登录


我应该如何组织大量的小组讨论?任何帮助都将不胜感激:)

如果您正在使用fxml,那么您可以为每个面板创建单独的fxml文件和关联的控制器类。这将在面板内将视图与逻辑分开,并将每个面板的视图和逻辑与其他面板分开

然后,当您需要在面板之间实际共享数据时,技巧就变成了——例如,更改用户表单需要通知要更改的用户。在这种情况下,您需要一些上下文信息。不同的方法是:

  • 使用全局存储(类似于服务器的http会话)
  • 例如guice、spring或CDI
  • 创建在面板之间传递数据的控件
  • 使用样式系统共享数据
  • 使用服务器管理状态实现
  • 使用像现在(不幸的是)已经失效的框架
  • 对于简单的应用程序,我会使用下面的命令“创建管理服务,控制面板之间的数据传递”。项目模板是一个程序,其中“程序的第一个面板是登录页面,下一个页面取决于插入的登录”


    如果您使用的是纯Java而不是fxml,那么您可以看看其他一些不使用fxml的Java项目是如何组织的,并以类似的方式组织您的项目。例如,和JavaFX-Henley销售数据应用程序(可作为与集成应用程序相同的示例代码包的一部分下载)。查看集成源代码可能是一个很好的开始。

    如果您的项目不是太大,那么我建议创建一个
    演示者
    类,它将控制舞台和节目流程,并显示许多
    视图
    类中的一个

    这是演示者类的一个示例:

    class Presenter {
    
    public void showA(Stage mainStage){
        ViewA a = new ViewA();
        a.setOnBackButton(new ViewCallback(){
            public void call(){
                showB();
            }
        });
        mainStage.setScene(new Scene(a));
    }
    
    public void showB(Stage mainStage){
        ViewB b = new ViewB();
        b.setOnBackButton(new ViewCallback(){
            public void call(){
                showA();
            }
        });
        mainStage.setScene(new Scene(b));
    }
    
    }
    
    这是
    视图
    主体的示例:

    public class ViewA {
    
    private ViewCallBack onBackButton = null;
    
    public void setOnBackButton(ViewCallback callback){ onBackButton = callback; }
    
    public void callBack() { if (onBackButton != null) onBackButton.call(); }
    
    ...
    
    // somewhere in your code
    Button b = new Button("shoot me!");
    b.setOnAction(new EventHandler<ActionEvent>(){
        public void handle(ActionEvent event){
            callBack();
        }
    });
    
    }
    

    您可以使用这个简单的回调接口或
    回调

    更新的答案来指出一些仅使用java代码并被拆分为多个面板的示例应用程序。
    public Interface ViewCallback {
        public void call();
    }