自定义JTable CellEditor:实现带动态更新的对象字段下拉选择
自定义JTable单元格编辑器:下拉框显示对象字段并动态更新
一、实现基础功能:下拉框显示对象指定字段,选中后存入另一字段到表格模型
要实现需求,需创建继承AbstractCellEditor并实现TableCellEditor的自定义编辑器,核心是为JComboBox设置自定义渲染器来展示对象的指定字段,同时在选中时返回需要存入表格模型的字段。
自定义编辑器代码
import javax.swing.*; import javax.swing.table.AbstractCellEditor; import javax.swing.table.TableCellEditor; import java.awt.*; import java.util.List; public class MyObjectCellEditor extends AbstractCellEditor implements TableCellEditor { private JComboBox<MyObject> comboBox; private MyObject selectedObject; public MyObjectCellEditor(List<MyObject> objectList) { comboBox = new JComboBox<>(objectList.toArray(new MyObject[0])); // 设置自定义渲染器,显示对象的指定字段 comboBox.setRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (value instanceof MyObject) { setText(((MyObject) value).getFieldToShow()); } return this; } }); // 选中项变化时触发编辑完成事件 comboBox.addActionListener(e -> { selectedObject = (MyObject) comboBox.getSelectedItem(); fireEditingStopped(); }); } @Override public Object getCellEditorValue() { // 返回需要存入表格模型的字段 return selectedObject != null ? selectedObject.getFieldToAdd() : null; } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { // 初始化选中当前单元格的对象 if (value instanceof MyObject) { selectedObject = (MyObject) value; comboBox.setSelectedItem(selectedObject); } return comboBox; } }
代码说明
- 构造函数接收对象列表,初始化JComboBox并绑定自定义渲染器,渲染器负责将
MyObject实例转换为要显示的文本(通过getFieldToShow()方法)。 - 为JComboBox添加选中事件监听器,选中时更新
selectedObject并触发编辑完成事件,通知表格模型保存值。 getCellEditorValue()方法返回最终要存入表格模型的字段值(通过getFieldToAdd()方法)。getTableCellEditorComponent()方法初始化编辑器时,将当前单元格的对象设为下拉框选中项。
使用示例
JTable table = new JTable(); List<MyObject> objectList = new ArrayList<>(); // 向objectList添加MyObject实例 table.getColumnModel().getColumn(0).setCellEditor(new MyObjectCellEditor(objectList));
二、动态更新下拉框的对象列表
要实现外部事件触发下拉列表更新,只需在自定义编辑器中添加一个更新列表的方法,直接操作JComboBox的模型:
添加更新方法到MyObjectCellEditor
public void updateComboBoxItems(List<MyObject> newObjectList) { DefaultComboBoxModel<MyObject> model = (DefaultComboBoxModel<MyObject>) comboBox.getModel(); model.removeAllElements(); newObjectList.forEach(model::addElement); // 保留原有选中项(如果新列表包含该对象) if (selectedObject != null && newObjectList.contains(selectedObject)) { model.setSelectedItem(selectedObject); } }
外部事件中调用更新
比如在按钮点击事件中更新下拉列表:
// 假设editor是已初始化的MyObjectCellEditor实例 JButton refreshBtn = new JButton("刷新列表"); refreshBtn.addActionListener(e -> { List<MyObject> newList = // 获取新的对象列表 editor.updateComboBoxItems(newList); });
内容的提问来源于stack exchange,提问作者Eljah
相关产品推荐
相关产品推荐

