JavaFX控制器initialize方法中部分代码与函数未执行的解决方法
问题排查与解决方案
针对你遇到的JavaFX控制器initialize方法内部分代码/函数未执行的问题,可按以下步骤排查解决:
1. 检查FXML控件注入是否正确
确保FXML文件中chk_active的fx:id与控制器内的变量名完全一致(包括大小写)。如果注入失败,调用chk_active.setSelected(true)会抛出NullPointerException,直接中断后续代码执行。
- 验证方式:在
chk_active.setSelected(true)前添加一行日志:
若控制台输出System.out.println("chk_active实例:" + chk_active);null,说明控件未成功注入,需修正FXML中的fx:id。
2. 捕获initialize方法中的所有异常
initialize方法默认不会向外抛出异常,内部未捕获的异常会直接中断代码执行。将initialize内的代码用try-catch包裹,查看具体异常信息:
@Override public void initialize(URL location, ResourceBundle resources) { try { txt_name.requestFocus(); btn_update.setVisible(false); btn_delete.setVisible(false); chk_active.setSelected(true); clear(); listner_txtbx(); setTable(); Populate_Table(); } catch (Exception e) { e.printStackTrace(); // 打印完整异常栈,定位问题 } }
3. 确认数据库连接初始化时机
控制器中直接实例化DBMysql db = new DBMysql();,但如果db.con在initialize执行时未完成连接,调用db.con.createStatement()会抛出NullPointerException,导致Populate_Table()执行中断。
- 解决方案:确保数据库连接在调用
Populate_Table()前完成初始化,例如:@Override public void initialize(URL location, ResourceBundle resources) { try { // ... 其他代码 db.initConnection(); // 假设DBMysql有初始化连接的方法 Populate_Table(); } catch (Exception e) { e.printStackTrace(); } } - 同时修改
Populate_Table()的异常捕获范围,避免遗漏非SQL异常:private void Populate_Table(){ System.out.println("inside table"); tblData.clear(); int status = chk_active.isSelected() ? 1 : 0; try { Statement st = db.con.createStatement(); String sql = String.format("select * from %s.tbl_brand where status = %d", db.schema, status); System.out.println(sql); ResultSet rs = st.executeQuery(sql); while (rs.next()) { tblData.add(new obj_BrandBuilder() .setCode(rs.getString("code")) .setName(rs.getString("name")) .setRemarks(rs.getString("remarks")) .setStatus(rs.getString("status")) .createObj_Brand()); } st.close(); } catch (Exception ex) { // 捕获所有异常 ex.printStackTrace(); } }
4. 验证TableView数据绑定
如果Populate_Table()开头的System.out.println("inside table");有输出,说明方法已执行,只是数据未显示。此时检查setTable()方法是否完成了数据绑定:
private void setTable() { // 确保添加这行代码,将数据源绑定到TableView tbl_brand.setItems(tblData); // ... 其他列配置代码 }
5. 避免UI线程阻塞
若数据库查询耗时较长,在initialize中直接执行会阻塞UI线程,导致代码执行异常。建议将数据库查询放到后台线程:
@Override public void initialize(URL location, ResourceBundle resources) { txt_name.requestFocus(); btn_update.setVisible(false); btn_delete.setVisible(false); chk_active.setSelected(true); clear(); listner_txtbx(); setTable(); // 后台线程执行数据库查询 Task<Void> loadDataTask = new Task<>() { @Override protected Void call() throws Exception { Populate_Table(); return null; } }; // 查询完成后刷新UI loadDataTask.setOnSucceeded(e -> tbl_brand.refresh()); new Thread(loadDataTask).start(); }
内容的提问来源于stack exchange,提问作者Rashid
相关产品推荐
相关产品推荐

