Database JavaFX-“;“进度窗口”;
我想显示一个小的“进度窗口”,它包含在一个FXML中,同时我将一些大的blob放入数据库中 问题是:在执行插入之前,窗口不会出现 我想可能是FXML加载程序太“慢”了吧? 因此无法显示窗口 我还尝试将ProgressIndicator直接添加到表单的FXML中,并在按下操作按钮时使其可见 同样的事情,Database JavaFX-“;“进度窗口”;,database,javafx,blob,progress-indicator,Database,Javafx,Blob,Progress Indicator,我想显示一个小的“进度窗口”,它包含在一个FXML中,同时我将一些大的blob放入数据库中 问题是:在执行插入之前,窗口不会出现 我想可能是FXML加载程序太“慢”了吧? 因此无法显示窗口 我还尝试将ProgressIndicator直接添加到表单的FXML中,并在按下操作按钮时使其可见 同样的事情,.setVisible方法在插入完成之前不起作用 这对我来说是个令人毛骨悚然的问题 我正在开发一个管理工具,我不能让用户插入一个大文件,如果有什么事情正在进行或没有,就不给他任何响应 如果有人能解决
.setVisible
方法在插入完成之前不起作用
这对我来说是个令人毛骨悚然的问题
我正在开发一个管理工具,我不能让用户插入一个大文件,如果有什么事情正在进行或没有,就不给他任何响应
如果有人能解决这个问题就好了
非常感谢 嗯。。。在乌鲁克比伊的暗示下,我开始四处尝试。 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;
}
现在添加一个监听器到任务中,事情就完成了
saveTask.setOnSucceeded(new EventHandler() {
@Override
public void handle(Event t) {
Progress.close();
if (saveTask.getValue() == 1){
//SUCCESS
} else {
//FAIL
}
}
});
希望这会对将来的人有所帮助。数据库操作应该在JavaFXUI线程之外的另一个线程中完成。否则,UI将暂时等待/冻结,直到DB任务完成。调查这件事。好吧。。。现在事情变得复杂了,我想。。。但是谢谢你的提示!
saveTask.setOnSucceeded(new EventHandler() {
@Override
public void handle(Event t) {
Progress.close();
if (saveTask.getValue() == 1){
//SUCCESS
} else {
//FAIL
}
}
});