我有一个关于在javafx中构建gui的问题。
当我构建一个包含许多页面的程序时,我的意思是例如 - 起始页包含几个按钮"添加用户"、"删除用户"、"更改用户数据" - 这些按钮中的每一个都会绘制一个不同的面板。这是我的问题 - 如何组织它们。当我将所有面板放在一个类中时,它会迅速变得巨大并产生许多错误。也很难找到损坏的代码部分。是否应该在不同的类中定义每个面板?但如果是这样,则从子菜单返回到主菜单存在问题。
或者另一个例子。程序的第一个面板是登录页面,下一页取决于插入的登录名。
我应该如何组织很多面板?任何帮助将不胜感激:)
如果您使用的是 fxml,则可以为每个面板创建一个单独的 fxml 文件和关联的控制器类。 这会将视图与面板中的逻辑分开,并将每个面板的视图和逻辑与所有其他面板分开。
然后,当您需要在面板之间实际共享数据时,诀窍就变成了 - 例如,需要通知更改用户表单要更改的用户。 在这种情况下,您需要具有某种上下文信息。 执行此操作的不同方法是:
- 使用全局存储(类似于服务器的 http 会话)。
- 集成依赖注入框架,如guice,spring或CDI。
- 创建控制面板之间传递数据的管理服务。
- 使用事件总线样式系统共享数据。
- 像具有服务器托管状态的 html 样式 Web 应用一样实现应用程序。
- 使用像现在(不幸的是)已经不存在的 jfxflow 这样的框架。
对于简单的应用程序,我会选择-"创建控制面板之间传递数据的管理服务",使用以下简单项目作为模板。 项目模板是一个程序,其中"程序的第一个面板是登录页面,下一页取决于插入的登录名"。
如果你使用的是纯Java而没有fxml,你可以看看其他一些不使用fxml的Java项目是如何组织的,并以类似的方式组织你的项目。 例如,JavaFX Ensemble App、willow 浏览器和 JavaFX Henley Sales Data App(可作为与 Ensemble App 相同的示例代码包的一部分下载)。 查看 Ensemble 源代码可能是一个很好的起点。
如果你的项目不是太大,那么我建议创建一个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 通用回调接口。