【问题标题】:Java: JComboBox inside JTable - setSelectedIndex has no effect on GUIJava:JTable 中的 JComboBox - setSelectedIndex 对 GUI 没有影响
【发布时间】:2013-03-16 14:28:46
【问题描述】:

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

我现在面临的问题是,当我使用 setSelectedIndex 以编程方式更改 ComboBox 的索引时,我在 GUI 中看不到任何结果,尽管模型使用 fireTableDataChanged 触发其更改并且也收到了 TableModelListener的表。当我查找更改后的 ComboBox 时,我也得到了正确的索引,但它没有显示在 GUI 中。我也尝试了revalidateupdateUIrepaint 的方法,没有任何改变。

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

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

}

getTableCellEditorComponent 错了吗?

rowmanager 包含所有模型的所有 JComboBoxes 和 CheckComboBoxes。

【问题讨论】:

  • 使用 JComboBox 可以轻松呈现 JTable 列。引用了here 的示例。请发布SSCCE 以获得更快的答复。

标签: java swing indexing jtable jcombobox


【解决方案1】:

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

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

重置模型中的数据。即>

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

【讨论】:

    猜你喜欢
    • 2012-08-21
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 2020-11-10
    • 2015-11-04
    • 2010-12-01
    • 2013-10-07
    • 2021-12-15
    相关资源
    最近更新 更多