0

I am having a JTable with two columns. In the second column there are different editors (JTextField, JComboBox and CheckComboBox), in each row one. This works fine so far however I have implemented a reset option which changes the whole JTable back to the original state (resets all changes).

The problem I am facing now is that when I programmatical change the index of a ComboBox with setSelectedIndex I see no result in the GUI although the model fires its change with fireTableDataChanged and is also receivied by an TableModelListener of the Table. When I lookup the changed ComboBox I also get the correct index however it is not shown in the GUI. I also tried the methods revalidate, updateUI and repaint wihtout any change.

The problem might lay in the architecture of it (maybe the Renderer?). Here is my Editor/Renderer class.

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);
}

}

Is the getTableCellEditorComponent wrong?

The rowmanager holds all the JComboBoxes and CheckComboBoxes with all the models.

mKorbel
  • 109,525
  • 20
  • 134
  • 319
Mike Noon
  • 129
  • 10
  • Its easy to render a JTable column using a JComboBox. An example cited [here](http://stackoverflow.com/questions/15272104/dynamic-jcombobox-items-inside-jtable/15275880#15275880). Please post an [SSCCE](http://sscce.org/) for sooner answer. – Amarnath Mar 26 '13 at 17:13

1 Answers1

2

when I programmatical change the index of a ComboBox with setSelectedIndex I see no result in the GUI

Renderer and editers just display the data in the model. Don't reset the editor component.

Reset the data in the model. ie>

table.setValueAt(...); // or
table.getModel().setValueAt(...);
camickr
  • 321,443
  • 19
  • 166
  • 288