【问题标题】:Javafx app with many pages具有许多页面的 Javafx 应用程序
【发布时间】:2013-01-13 08:06:21
【问题描述】:

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

当我构建一个包含许多页面的程序时,例如 - 起始页面包含几个按钮“添加用户”、“删除用户”、“更改用户数据” - 每个按钮都绘制不同的面板。这是我的问题 - 如何组织它们。 当我将所有面板放在一个类中时,它会很快变得巨大并产生许多错误。也很难找到损坏的代码部分。 是否应该在不同的类中定义每个面板?但是如果是这样的话,从子菜单返回到主菜单就有问题了。

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

我应该如何组织大量的面板?任何帮助将不胜感激:)

【问题讨论】:

    标签: user-interface javafx panels


    【解决方案1】:

    如果您的项目不是太大,那么我建议创建一个Presenter 类,它可以控制舞台和程序流程,并显示许多View 类之一。

    这是演示者类的示例:

    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));
    }
    
    }
    

    这是view 正文的示例:

    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();
        }
    });
    
    }
    

    这是ViewCallback接口

    public Interface ViewCallback {
        public void call();
    }
    

    你可以使用这个简单的回调接口或者Callback&lt;P,R&gt;JavFX generic callback interface。

    【讨论】:

      【解决方案2】:

      如果您使用的是 fxml,那么您可以为每个面板创建一个单独的 fxml 文件和关联的 Controller 类。这会将面板中的视图与逻辑分开,并将每个面板的视图和逻辑与其他面板分开。

      当您需要在面板之间实际共享数据时,技巧就变成了 - 例如,需要通知更改用户表单来更改用户。在这种情况下,您需要有某种上下文信息。执行此操作的不同方法是:

      1. 使用全局存储(类似于服务器的 http 会话)。
      2. Integrate a dependency injection framework,例如 guice、spring 或 CDI。
      3. 创建management services,用于控制面板之间的数据传递。
      4. 使用event bus 风格的系统来共享数据。
      5. 使用服务器托管状态实现your application like a html style web app。
      6. 使用像现在(很遗憾)已失效的 jfxflow 这样的框架。

      对于简单的应用程序,我会选择 - “创建控制面板之间传递数据的管理服务”,使用以下 simple project as a template。项目模板是一个程序,其中“程序的第一个面板是登录页面,下一页取决于插入的登录”。

      如果您使用的是纯 Java 而没有 fxml,您可以查看其他一些不使用 fxml 的 Java 项目是如何组织的,并以类似的方式组织您的项目。例如,JavaFX Ensemble App、willow browser 和 JavaFX Henley Sales Data 应用程序(可作为与 Ensemble 应用程序相同的示例代码包的一部分下载)。查看 Ensemble 源代码可能是一个不错的起点。

      【讨论】:

      • 更新了答案,指出一些仅使用 java 代码并拆分为多个面板的示例应用程序。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      相关资源
      最近更新 更多