You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为不可编辑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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:16:53