1

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

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

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

我应该如何组织很多面板?任何帮助,将不胜感激 :)

4

2 回答 2

2

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

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

  1. 使用全局存储(类似于服务器的 http 会话)。
  2. 集成依赖注入框架,例如 guice、spring 或 CDI。
  3. 创建控制面板之间传递数据的管理服务。
  4. 使用事件总线样式系统来共享数据。
  5. 将您的应用程序实现为具有服务器管理状态的 html 样式 Web 应用程序。
  6. 使用像现在(不幸的是)已经失效的jfxflow这样的框架。

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

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

于 2013-01-29T18:52:34.623 回答
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<P,R> JavFX 通用回调接口

于 2013-02-09T07:39:06.703 回答