You need to enable JavaScript to run this app. 为什么JTable中所有JComboBox均显示最新添加的同一组选项值?
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 20:54:03