-1

我想显示一个包含在 FXML 中的小“进度窗口”,同时我将一些大 BLOB 放入数据库中。

问题是:在执行插入之前,窗口不会出现。

我想这可能是 FXML 加载器太“慢”的问题?因此无法显示窗口。

我还尝试将 ProgressIndicator 直接添加到表单的 FXML 中,并使其在按下操作按钮时才可见。

同样的事情-在.setVisible插入完成之前,该方法将不起作用。

这对我来说是非常非常非常令人毛骨悚然的问题。

我正在开发一个管理工具,我不能让用户插入一个大文件,如果有事情正在进行中,我不给他任何回应!?

如果有人有解决这个问题的方法就好了!

最好的感谢!

4

1 回答 1

3

嗯……在 Uluk Biy 的暗示之后,我开始尝试。6小时后,我做了这样的伎俩:

这是我的方法,它返回所需的任务。

public static Task saveNewAccoounting(final Accounting a){
    Task<Integer> saveNewAccountingTask = new Task<Integer>() {
        @Override protected Integer call() throws Exception {
            try {
                run.logger.log(Level.FINE, "Started saveNewAccounting Task!");
                PreparedStatement newAcc;
                      newAcc = Connect.con.prepareStatement("INSERT INTO `ACCOUNTING`(`ACCNUMBER`, `ACCDATE`, `SHOP`, `CUSTOMER`, `CATEGORIES`, `WRITTENBY`, `DATE`, `DESCRIPTION`, `NOTE`, `PRICE`, `FILEORIGINAL`, `FILEBYTE`) VALUES (null,null,?,?,?,?,?,?,?,?,?,?)");
                      newAcc.setInt(1, a.getShop());
                      newAcc.setInt(2, a.getCustomer());
                      newAcc.setInt(3, a.getCategories());
                      newAcc.setInt(4, Credentials.getUserid());
                      newAcc.setDate(5, a.getDate());
                      newAcc.setString(6, a.getDescription());
                      if (a.getNote().equals("")){
                        newAcc.setNull(7, java.sql.Types.VARCHAR);
                      } else {
                        newAcc.setString(7, a.getNote());    
                      }
                      newAcc.setDouble(8, a.getPrice());
                      if(a.getAttachment() != null){
                          newAcc.setString(9, a.getAttachment().getName());
                          newAcc.setBlob(10, new FileInputStream(a.getAttachment()));
                      } else {
                          newAcc.setNull(9, java.sql.Types.VARCHAR);
                          newAcc.setNull(10, java.sql.Types.BLOB);
                      }
                      if(!newAcc.execute()){
                          newAcc.close();
                          run.logger.log(Level.FINE, "Successfully completed saveNewAccounting Task!");
                          return 1;
                      } else {
                          newAcc.close();
                          run.logger.log(Level.FINE, "Completed saveNewAccounting Task with Failures!");
                          return 0;
                      }
            } catch (SQLException ex) {
                run.dblogger.log(Level.SEVERE, ex.getMessage());
                run.logger.log(Level.FINE, "Completed saveNewAccounting Task with Failures!");
                return 0;
            } catch (FileNotFoundException f){
                run.iologger.log(Level.SEVERE, f.getMessage());
                run.logger.log(Level.FINE, "Completed saveNewAccounting Task with Failures!");
                return 0;
            }
        }
    };
   return saveNewAccountingTask;
}

然后,您所要做的就是使用返回的 Task 实例化一个 Thread 并执行它。

//Make your Progress visible here
final Task saveTask = SaveTasks.saveNewAccoounting(acc);
Thread saveThread = new Thread(saveTask);
saveThread.setDaemon(true);
saveThread.start();

现在为任务添加一个监听器,事情就完成了。

saveTask.setOnSucceeded(new EventHandler() {
                   @Override
                    public void handle(Event t) {
                        Progress.close();
                        if (saveTask.getValue() == 1){
                            //SUCCESS
                        } else {
                            //FAIL
                        }
                    }
                });

希望这对将来的人有所帮助。

于 2013-10-24T12:34:13.137 回答