为什么JTable中所有JComboBox均显示最新添加的同一组选项值?
问题根源
Swing的JTable单元格编辑器是列级配置,你两次获取的getColumn(0)返回的是同一个列对象,第二次调用setCellEditor直接覆盖了第一次的配置,因此该列所有行都会共用最后设置的下拉框编辑器。
解决方案
自定义行级动态下拉编辑器,根据当前触发编辑的行号加载对应选项,修改后可运行的完整代码如下:
package main; import java.awt.Color; import java.awt.Font; import java.util.ArrayList; import java.util.List; import javax.swing.DefaultCellEditor; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; public class SwingDemo { // 存储每一行对应的下拉选项 private static final List<List<String>> rowOptions = new ArrayList<>(); // 自定义动态下拉框编辑器 static class DynamicComboBoxEditor extends DefaultCellEditor { private final JComboBox<String> comboBox; public DynamicComboBoxEditor() { super(new JComboBox<>()); this.comboBox = (JComboBox<String>) getComponent(); } @Override public java.awt.Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { comboBox.removeAllItems(); // 加载当前行对应的选项 List<String> currRowOptions = rowOptions.get(row); for (String option : currRowOptions) { comboBox.addItem(option); } comboBox.setSelectedItem(value); return comboBox; } } public static void main(String[] argv) throws Exception { DefaultTableModel model = new DefaultTableModel(); model.addColumn("Column 1"); JTable table = new JTable(model); Font font = new Font("Verdana", Font.PLAIN, 12); table.setFont(font); table.setRowHeight(30); table.setBackground(Color.orange); table.setForeground(Color.white); JFrame frame = new JFrame(); frame.setSize(600, 400); frame.add(new JScrollPane(table)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); // 给列只设置一次自定义编辑器 TableColumn column = table.getColumnModel().getColumn(0); column.setCellEditor(new DynamicComboBoxEditor()); // 添加第一行 model.addRow("".split("")); List<String> testArray = new ArrayList<>(); testArray.add("one"); testArray.add("two"); testArray.add("three"); rowOptions.add(testArray); // 添加第二行 model.addRow("".split("")); List<String> testArray2 = new ArrayList<>(); testArray2.add("four"); testArray2.add("five"); testArray2.add("six"); rowOptions.add(testArray2); } }
实现逻辑说明
- 用全局集合
rowOptions存储每一行对应的下拉选项集合,新增行时同步添加对应选项到集合中 - 自定义编辑器继承
DefaultCellEditor,重写getTableCellEditorComponent方法,每次触发编辑时根据当前行号加载对应选项到下拉框 - 给目标列仅设置一次自定义编辑器即可,不需要新增一行就重复设置编辑器
内容的提问来源于stack exchange,提问作者user2976594
相关产品推荐
相关产品推荐

