Java:JTable-setSelectedIndex中的JComboBox对GUI没有影响

Java:JTable-setSelectedIndex中的JComboBox对GUI没有影响,java,swing,indexing,jtable,jcombobox,Java,Swing,Indexing,Jtable,Jcombobox,我有一个有两列的JTable。在第二列中,每一行都有不同的编辑器(JTextField、JComboBox和CheckComboBox)。到目前为止,它工作得很好,但是我已经实现了一个重置选项,它将整个JTable更改回原始状态(重置所有更改) 我现在面临的问题是,当我使用setSelectedIndex编程更改组合框的索引时,我在GUI中看不到任何结果,尽管模型使用fireTableDataChanged触发其更改,并且也由表的tablemodelstener接收。当我查找更改的组合框时,我也

我有一个有两列的JTable。在第二列中,每一行都有不同的编辑器(JTextField、JComboBox和CheckComboBox)。到目前为止,它工作得很好,但是我已经实现了一个重置选项,它将整个JTable更改回原始状态(重置所有更改)

我现在面临的问题是,当我使用
setSelectedIndex
编程更改组合框的索引时,我在GUI中看不到任何结果,尽管模型使用
fireTableDataChanged
触发其更改,并且也由表的
tablemodelstener
接收。当我查找更改的组合框时,我也会得到正确的索引,但是它不会显示在GUI中。我还尝试了
revalidate
updateUI
repaint
方法,但没有任何更改

问题可能在于它的架构(可能是渲染器?)。这是我的编辑器/渲染器类

class VEachRowEditor implements TableCellEditor, TableCellRenderer {

protected Hashtable<Integer, TableCellEditor> editors;
protected TableCellEditor editor, defaultEditor, renderer;
JTable table;
VEachRowEditorManager rowmanager;

public VEachRowEditor(JTable table, VEachRowEditorManager rowmanager) {
    this.table = table;
    editors = new Hashtable<Integer, TableCellEditor>();
    defaultEditor = new DefaultCellEditor(new JTextField());
    this.rowmanager = rowmanager;
}

public void setEditorAt(int row, TableCellEditor editor) {
    if (editor instanceof DefaultCellEditor)
        ((DefaultCellEditor) editor).setClickCountToStart(1);
    editors.put(new Integer(row), editor);
}

public Component getTableCellEditorComponent(JTable table, Object value,
        boolean isSelected, int row, int column) {
    editor = (TableCellEditor) editors.get(new Integer(row));
    if (editor == null) {
        editor = defaultEditor;
    }
    return editor.getTableCellEditorComponent(table, value, isSelected,
            row, column);
}

public Object getCellEditorValue() {
    return editor.getCellEditorValue();
}

public final boolean stopCellEditing() {
    return editor.stopCellEditing();
}

public void cancelCellEditing() {
    editor.cancelCellEditing();
}

public boolean isCellEditable(EventObject anEvent) {
    selectEditor((MouseEvent) anEvent);
    return editor.isCellEditable(anEvent);
}

public void addCellEditorListener(CellEditorListener l) {
    editor.addCellEditorListener(l);
}

public void removeCellEditorListener(CellEditorListener l) {
    editor.removeCellEditorListener(l);
}

public boolean shouldSelectCell(EventObject anEvent) {
    selectEditor((MouseEvent) anEvent);
    return editor.shouldSelectCell(anEvent);
}

protected void selectEditor(MouseEvent e) {
    int row;
    if (e == null) {
        row = table.getSelectionModel().getAnchorSelectionIndex();
    } else {
        row = table.rowAtPoint(e.getPoint());
    }
    editor = (TableCellEditor) editors.get(new Integer(row));
    if (editor == null) {
        System.out.println(editor);
        editor = defaultEditor;
    }
}

@Override
public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column) {
    renderer = (TableCellEditor) editors.get(new Integer(row));
    if (renderer == null) {
        renderer = defaultEditor;
    }

    return renderer.getTableCellEditorComponent(table, value, isSelected,
            row, column);
}
类VEachRowEditor实现TableCellEditor和TableCellRenderer{ 受保护的哈希表编辑器; 受保护的TableCellEditor、defaultEditor、渲染器; JTable表; VEachRowEditorManager行管理器; 公共VEachRowEditor(JTable表,VEachRowEditorManager行管理器){ this.table=表格; editors=newhashtable(); defaultEditor=新的DefaultCellEditor(新的JTextField()); this.rowmanager=rowmanager; } 公共void集合编辑器(int行,TableCellEditor){ if(编辑器实例of DefaultCellEditor) ((DefaultCellEditor)编辑器)。设置ClickCountToStart(1); put(新整数(行),编辑器); } 公共组件getTableCellEditorComponent(JTable表、对象值、, 布尔值(选定,int行,int列){ editor=(TableCellEditor)editors.get(新整数(行)); 如果(编辑器==null){ 编辑器=默认编辑器; } 返回编辑器.getTableCellEditorComponent(表、值、isSelected、, 行、列); } 公共对象getCellEditorValue(){ 返回editor.getCellEditorValue(); } 公共最终布尔stopCellEditing(){ return editor.stopCellEditing(); } 公共作废取消编辑(){ editor.cancelleediting(); } 公共布尔值isCellEditable(EventObject anEvent){ 选择编辑器((MouseEvent)anEvent); return editor.isCellEditable(anEvent); } public void addCellEditorListener(CellEditorListener l){ 编辑者。addCellEditorListener(l); } public void removeCellEditorListener(CellEditorListener l){ 编者:removeCellEditorListener(l); } 公共布尔值shouldSelectCell(EventObject anEvent){ 选择编辑器((MouseEvent)anEvent); 返回编辑器。shouldSelectCell(anEvent); } 受保护的void selectEditor(MouseEvent e){ int行; 如果(e==null){ 行=表.getSelectionModel().getAnchorSelectionIndex(); }否则{ row=table.rowAtPoint(如getPoint()); } editor=(TableCellEditor)editors.get(新整数(行)); 如果(编辑器==null){ System.out.println(编辑器); 编辑器=默认编辑器; } } @凌驾 公共组件GetTableCellRenderComponent(JTable表、对象值、, 布尔值(已选择,布尔值为焦点,整数行,整数列){ renderer=(TableCellEditor)editors.get(新整数(行)); if(渲染器==null){ renderer=defaultEditor; } 返回renderer.getTableCellEditorComponent(表、值、isSelected、, 行、列); } }

getTableCellEditorComponent
是否错误

rowmanager
保存所有模型的所有JComboBox和复选框

当我用setSelectedIndex编程更改组合框的索引时,在GUI中看不到任何结果

渲染器和编辑器只显示模型中的数据。不要重置编辑器组件

重置模型中的数据。ie>

table.setValueAt(...); // or
table.getModel().setValueAt(...);

使用JComboBox很容易呈现JTable列。举了一个例子。请发布一个更快的答案。