JavaFX ComboBox选中项显示对象而非属性的解决方法
解决JavaFX ComboBox选中后显示对象而非属性的问题
这问题我之前开发JavaFX界面时也踩过坑!你现在的代码只给ComboBox的下拉列表选项配置了自定义单元格,但选中后顶部显示的"按钮单元格"(buttonCell)还是用的默认逻辑——默认会调用对象的toString()方法,所以才会出现classes.SimpleTableObject@137ff5c这种对象内存地址式的输出。
两种解决方案,推荐第一种:
方案1:给ComboBox设置buttonCell(推荐,低耦合)
你可以把下拉列表的单元格逻辑复用给buttonCell,这样不管是下拉选项还是选中后的显示,都会统一展示材料名称。修改后的代码如下:
material_comboBox_type.getItems().addAll(types); // 定义通用的单元格渲染逻辑 Callback<ListView<SimpleTableObject>, ListCell<SimpleTableObject>> customCellFactory = param -> new ListCell<SimpleTableObject>() { @Override public void updateItem(SimpleTableObject item, boolean empty) { super.updateItem(item, empty); // 空项或无数据时显示null,否则显示材料名称 setText(empty || item == null ? null : item.getName().get()); } }; // 给下拉列表设置单元格工厂 material_comboBox_type.setCellFactory(customCellFactory); // 给选中后显示的按钮单元格应用同样的渲染逻辑 material_comboBox_type.setButtonCell(customCellFactory.call(null));
这样修改后,选中项就会正确显示材料名称了,而且不会影响SimpleTableObject类在其他场景的toString()行为。
方案2:重写SimpleTableObject的toString()方法(简单但耦合高)
如果你的项目里SimpleTableObject的toString()本来就只需要返回材料名称,也可以直接重写这个方法:
public class SimpleTableObject { // 你的其他代码... @Override public String toString() { return getName().get(); } }
这种方式不用修改ComboBox的配置,但缺点是如果后续需要在其他地方用toString()输出对象的完整信息,就会冲突,所以只适合场景单一的情况。
内容的提问来源于stack exchange,提问作者Mr. Crow
相关产品推荐
相关产品推荐

