适用于小型/中型/大型桌面应用程序的JavaFX最佳实践指南?
我正在一个开发多窗口桌面应用程序的项目中学习JavaFX+FXML。后来针对这些窗口之间的一些依赖关系(gui 1中的更改刷新gui 2、gui x…) 现在我想知道有经验的javafx开发人员是如何组织他们的项目的?适用于小型/中型/大型桌面应用程序的JavaFX最佳实践指南?,java,javafx,Java,Javafx,我正在一个开发多窗口桌面应用程序的项目中学习JavaFX+FXML。后来针对这些窗口之间的一些依赖关系(gui 1中的更改刷新gui 2、gui x…) 现在我想知道有经验的javafx开发人员是如何组织他们的项目的? 他们如何使用多窗口? 如何打开并重新初始化已打开的窗口? 他们如何处理所有类别的问题? 他们如何处理数据库连接/sql调用? 我尝试使用某种MVC模式进行开发,为每个窗口使用一个包: ModelWindowname.java -- Model Windowname.fx
他们如何使用多窗口?
如何打开并重新初始化已打开的窗口?
他们如何处理所有类别的问题?
他们如何处理数据库连接/sql调用? 我尝试使用某种MVC模式进行开发,为每个窗口使用一个包:
ModelWindowname.java -- Model
Windowname.fxml -- View
Windowname.css --
ControllerWindowname.java -- Controller
然后我很难找到一种从不同类初始化窗口的方法。我可以通过创建自定义加载程序对象和创建自己的初始化方法(下面的示例)来解决这个问题
@FXML
void openGuiOne(ActionEvent事件)引发IOException{
/*
*我们没有将FXMLLoader放入try/catch块中,因此抛出IOException。
*为什么?用户对这里发生的事情没有影响,所以我们可以避免
*代码和跟踪信息过载。
*/
阶段间隔=零;
父oScene=null;
//检查舞台是否已打开
if(StageHandler.stageReadyOpened(“gui_one”)==false){
//如果没有,请根据One.fxml设计打开一个新窗口并设置一些属性
oScene=fxmloader.load(getClass().getResource(“/com/mytool/one/one.fxml”);//需要抛出IOException
oStage=新阶段();
oStage.setScene(新场景(oScene));
oStage.setTitle(“一”);
oStage.setresizeable(假);
oStage.setX(475.0);//在启动时设置窗口的x位置
oStage.setY(410.0);//在启动时设置窗口的y位置
oStage.show();
//查看StageHandler类以获取有关该类的详细信息
StageHandler.addStage(“gui_one”,oStage);
//EventHandler-仅关闭此窗口(如果已关闭)
setOnCloseRequest(新的EventHandler(){
@凌驾
公共无效句柄(WindowEvent事件){
StageHandler.delStage(“gui_one”);
}
});
}否则{
//如果窗口已经打开,请将其拉到前台
StageHandler.getStage(“gui_one”).toFront();
}
}
如果我想从另一个gui上的按钮打开gui,然后打开主gui,我该怎么做?我现在就是这样做的:
@FXML
void openGuiOne(ActionEvent event) throws IOException, SQLException {
/*
* We don't put the FXMLLoader into try/catch blocks, so we throw the IOException.
* Why? The user has no impact on what's going on here, so we can avoid the
* overload on code and trace-information.
*/
Stage oStage = null;
FXMLLoader oLoaderOne = new FXMLLoader(getClass().getResource("/com/mytool/one/One.fxml"));
// Check if the stage is already opened
if (StageHandler.stageAlreadyOpened("gui_one") == false) {
// if not, open a new window based on the One.fxml design and set some properties
oStage = new Stage();
oStage.setScene(new Scene(oLoaderOne.load()));
ControllerOne oControllerOne = oLoaderOne.getController();
oStage.setTitle("One");
oStage.setResizable(false);
oStage.setX(475.0); // Set x-position of the window on startup
oStage.setY(50.0); // Set y-position of the window on startup
oControllerOne.myInitialize("");
oStage.show();
// Look into StageHandler-Class for detailed information about the class
StageHandler.addStage("gui_one", oStage);
// EventHandler - close only this window if it's closed
oStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
StageHandler.delStage("gui_one");
}
});
} else {
// if window is already opened, pull it to the foreground
StageHandler.getStage("gui_one").toFront();
}
}
@FXML
void openGuiOne(ActionEvent事件)引发IOException、SQLException{
/*
*我们没有将FXMLLoader放入try/catch块中,因此抛出IOException。
*为什么?用户对这里发生的事情没有影响,所以我们可以避免
*代码和跟踪信息过载。
*/
阶段间隔=零;
FXMLLoader-oLoaderOne=新的FXMLLoader(getClass().getResource(“/com/mytool/one/one.fxml”);
//检查舞台是否已打开
if(StageHandler.stageReadyOpened(“gui_one”)==false){
//如果没有,请根据One.fxml设计打开一个新窗口并设置一些属性
oStage=新阶段();
oStage.setScene(新场景(oLoaderOne.load());
ControllerOne-oControllerOne=oLoaderOne.getController();
oStage.setTitle(“一”);
oStage.setresizeable(假);
oStage.setX(475.0);//在启动时设置窗口的x位置
oStage.setY(50.0);//在启动时设置窗口的y位置
oControllerOne.myInitialize(“”);
oStage.show();
//查看StageHandler类以获取有关该类的详细信息
StageHandler.addStage(“gui_one”,oStage);
//EventHandler-仅关闭此窗口(如果已关闭)
setOnCloseRequest(新的EventHandler(){
@凌驾
公共无效句柄(WindowEvent事件){
StageHandler.delStage(“gui_one”);
}
});
}否则{
//如果窗口已经打开,请将其拉到前台
StageHandler.getStage(“gui_one”).toFront();
}
}
但是,对于我能够打开的每个gui,我总是必须在每个控制器上复制大量的代码行吗?
好吧,由于我必须在多个地方改变它,我甚至不会去想它。但现在我不知道该怎么处理。我相信我对oop很在行,我只是从来没有使用oop创建过桌面应用程序
到目前为止,我对研究这些问题的印象是:几乎每一秒的答案都像是“这是唯一的出路”,但每一个答案都是不同的
我找到了这篇文章[但不幸的是,我找不到任何(可信的)其他东西]。
javafx上是否有小型/中型/大型专业开源项目?我的第一次尝试是了解开源项目以及大型项目的结构……我还没有找到桌面应用程序。
或者有谁知道一个我完全错过的最佳实践指南,并且被更多的人所遵循
致以最诚挚的问候。你应该做的第一件事是不要像这里这么多人那样试图重新发明轮子。看看现有的JavaFX应用程序框架,例如MVVMFX
这样的应用程序框架将为您的项目提供一个坚实的结构,您可以在此基础上进行构建。我将对此进行研究。谢谢您。
@FXML
void openGuiOne(ActionEvent event) throws IOException, SQLException {
/*
* We don't put the FXMLLoader into try/catch blocks, so we throw the IOException.
* Why? The user has no impact on what's going on here, so we can avoid the
* overload on code and trace-information.
*/
Stage oStage = null;
FXMLLoader oLoaderOne = new FXMLLoader(getClass().getResource("/com/mytool/one/One.fxml"));
// Check if the stage is already opened
if (StageHandler.stageAlreadyOpened("gui_one") == false) {
// if not, open a new window based on the One.fxml design and set some properties
oStage = new Stage();
oStage.setScene(new Scene(oLoaderOne.load()));
ControllerOne oControllerOne = oLoaderOne.getController();
oStage.setTitle("One");
oStage.setResizable(false);
oStage.setX(475.0); // Set x-position of the window on startup
oStage.setY(50.0); // Set y-position of the window on startup
oControllerOne.myInitialize("");
oStage.show();
// Look into StageHandler-Class for detailed information about the class
StageHandler.addStage("gui_one", oStage);
// EventHandler - close only this window if it's closed
oStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
StageHandler.delStage("gui_one");
}
});
} else {
// if window is already opened, pull it to the foreground
StageHandler.getStage("gui_one").toFront();
}
}