如何使用JComboBox单元格编辑器修复JTable的java.awt.IllegalComponentStateException?

如何使用JComboBox单元格编辑器修复JTable的java.awt.IllegalComponentStateException?,java,swing,exception,jtable,jcombobox,Java,Swing,Exception,Jtable,Jcombobox,我需要显示表中每一行的动态数据集,因此我使用DefaultCellEditor(JComboBox)并使用PopupMenuListener将数据加载到他的DefaultComboxModel。 我的问题是:当我点击表格的一个单元格时,JComboBox不显示弹出列表,应用程序抛出异常。 我使用Java7 如何修复它 代码示例: import javax.swing.DefaultCellEditor; import javax.swing.DefaultComboBoxModel; impor

我需要显示表中每一行的动态数据集,因此我使用DefaultCellEditor(JComboBox)并使用PopupMenuListener将数据加载到他的DefaultComboxModel。 我的问题是:当我点击表格的一个单元格时,JComboBox不显示弹出列表,应用程序抛出异常。 我使用Java7

如何修复它

代码示例:

import javax.swing.DefaultCellEditor;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

public class TestTable extends JFrame implements PopupMenuListener
{
    public TestTable()
    {
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        String[] data = new String[]{"A", "B"};        
        DefaultTableModel mdlTable = new DefaultTableModel();
        mdlTable.addColumn("Col");
        for (int i = 0; i < 3; i++) {
            mdlTable.addRow(data);
        }
        JTable tbl = new JTable(mdlTable);

        TableColumnModel mdlColumn = tbl.getColumnModel();
        TableColumn clm = mdlColumn.getColumn(0);
        DefaultComboBoxModel mdlComboBox = new DefaultComboBoxModel();
        JComboBox cmb = new JComboBox(mdlComboBox);
        cmb.addPopupMenuListener(this);
        clm.setCellEditor(new DefaultCellEditor(cmb));

        setContentPane(new JScrollPane(tbl));
        setSize(200, 200);
        setVisible(true);
    }

    @Override
    public void popupMenuWillBecomeVisible(PopupMenuEvent e)
    {
        JComboBox cmb = (JComboBox) e.getSource();
        DefaultComboBoxModel mdl = (DefaultComboBoxModel) cmb.getModel();
        mdl.removeAllElements();

        String[] data = new String[]{"A", "B", "C", "D"};

        for (String item : data) {
            mdl.addElement(item);
        }
    }

    @Override
    public void popupMenuWillBecomeInvisible(PopupMenuEvent e)
    {
    }

    @Override
    public void popupMenuCanceled(PopupMenuEvent e)
    {
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new TestTable();
            }
        });
    }
}

一个简单的解决方法是更改模型,而不是向现有模型添加图元:

@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e)
{
    JComboBox<String> cmb = (JComboBox<String>) e.getSource();
    cmb.setModel(new DefaultComboBoxModel<>(new String[]{"A", "B", "C", "D"}));
}
@覆盖
public void弹出菜单将变为可见(弹出菜单事件e)
{
jComboxCMB=(jComboxE.getSource();
setModel(新的DefaultComboxModel(新字符串[]{“A”、“B”、“C”、“D”}));
}
我在这里找到了另一个解决方案
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e)
{
    JComboBox<String> cmb = (JComboBox<String>) e.getSource();
    cmb.setModel(new DefaultComboBoxModel<>(new String[]{"A", "B", "C", "D"}));
}