Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
适用于小型/中型/大型桌面应用程序的JavaFX最佳实践指南?_Java_Javafx - Fatal编程技术网

适用于小型/中型/大型桌面应用程序的JavaFX最佳实践指南?

适用于小型/中型/大型桌面应用程序的JavaFX最佳实践指南?,java,javafx,Java,Javafx,我正在一个开发多窗口桌面应用程序的项目中学习JavaFX+FXML。后来针对这些窗口之间的一些依赖关系(gui 1中的更改刷新gui 2、gui x…) 现在我想知道有经验的javafx开发人员是如何组织他们的项目的? 他们如何使用多窗口? 如何打开并重新初始化已打开的窗口? 他们如何处理所有类别的问题? 他们如何处理数据库连接/sql调用? 我尝试使用某种MVC模式进行开发,为每个窗口使用一个包: ModelWindowname.java -- Model Windowname.fx

我正在一个开发多窗口桌面应用程序的项目中学习JavaFX+FXML。后来针对这些窗口之间的一些依赖关系(gui 1中的更改刷新gui 2、gui x…)

现在我想知道有经验的javafx开发人员是如何组织他们的项目的?
他们如何使用多窗口?
如何打开并重新初始化已打开的窗口?
他们如何处理所有类别的问题?
他们如何处理数据库连接/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();
    }
}