如何为不可编辑ComboBox设置值?求示例代码及空值排查
解决JavaFX不可编辑ComboBox无法设置选中值的问题
首先看你代码里最直接的问题——字符串比较用了==而不是equals(),这是Java里很常见的坑:
// 错误写法:==比较的是字符串对象的引用,不是内容 Predicate<City> predicate = city -> city.getCityName() == "Itbayat"; // 正确写法:用equals()比较内容,把常量放前面还能避免空指针 Predicate<City> predicate = city -> "Itbayat".equals(city.getCityName());
改成上面的写法后,应该就能正确过滤到目标City对象,从而让ComboBox选中对应值了。
另外还有几个需要优化的点:
1. AddressGetWay的线程安全与资源泄漏问题
你把PreparedStatement和ResultSet声明成了静态变量,这会导致多线程调用或者多次查询时出现资源冲突、泄漏的问题,应该把它们改成方法内的局部变量:
public class AddressGetWay { static Connection con; // 建议在这里初始化数据库连接(比如静态块),避免con为null static { try { Class.forName("com.mysql.cj.jdbc.Driver"); // 根据你的数据库驱动调整 con = DriverManager.getConnection("jdbc:mysql://localhost:3306/your_db", "username", "password"); } catch (ClassNotFoundException | SQLException ex) { Logger.getLogger(AddressGetWay.class.getName()).log(Level.SEVERE, null, ex); } } public static ObservableList<City> getCityByProvince(String prov) { ObservableList<City> listData = FXCollections.observableArrayList(); String sql = "SELECT pk_cit_id, cit_nm, zip_code FROM city_mun WHERE prov_code = (SELECT prov_code FROM provinces WHERE prov_nm = ?)"; // 把pst和rs改成局部变量,避免静态变量的线程安全问题 PreparedStatement pst = null; ResultSet rs = null; try { pst = con.prepareStatement(sql); pst.setString(1, prov); rs = pst.executeQuery(); while (rs.next()) { listData.add(new City( rs.getInt(1), rs.getString(2), rs.getInt(3) )); } } catch (SQLException ex) { Logger.getLogger(AddressGetWay.class.getName()).log(Level.SEVERE, null, ex); } finally { // 要先判断对象是否为null再关闭,避免空指针 try { if (rs != null) rs.close(); if (pst != null) pst.close(); } catch (SQLException ex) { Logger.getLogger(AddressGetWay.class.getName()).log(Level.SEVERE, null, ex); } } return listData; } }
2. 确认数据库查询返回的数据是否正确
可以在设置ComboBox之前加个打印,验证data里确实包含名为"Itbayat"的城市:
data.forEach(city -> System.out.println("Loaded city: " + city.getCityName()));
如果打印里没有这个城市,那要检查你的SQL查询逻辑是否正确,比如province参数"Batanes"是否匹配数据库里的省份名称。
3. 命名规范优化
AddressGetWay拼写有误,应该是AddressGateway(正确的单词是Gateway)cmbCity可以改成cityComboBox,语义更清晰,符合Java可读性规范- 数据库字段用下划线没问题,但Java实体类的变量要保持小驼峰(比如你的
City类的cityName是正确的)
按上面的步骤调整后,你的ComboBox应该就能正确选中目标值了。
内容的提问来源于stack exchange,提问作者miKeL
相关产品推荐
相关产品推荐

