如何使用JComboBox单元格编辑器修复JTable的java.awt.IllegalComponentStateException?
我需要显示表中每一行的动态数据集,因此我使用DefaultCellEditor(JComboBox)并使用PopupMenuListener将数据加载到他的DefaultComboxModel。 我的问题是:当我点击表格的一个单元格时,JComboBox不显示弹出列表,应用程序抛出异常。 我使用Java7 如何修复它 代码示例:如何使用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
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"}));
}