Swing: несколько редакторов ячеек для столбца

В моем JTable у меня есть два редактируемых числовых столбца. Редактор для обоих столбцов расширяет AbstractCellEditor и использует JFormattedTextField в качестве компонента редактирования.

Проблема в том, что формат ввода зависит от значения другого столбца в строке. Если условие X выполнено, количество цифр дроби должно быть Y, иначе они должны быть Y+2.

Я попытался переопределить метод getTableCellEditor(..), чтобы связать TableCellEditor с каждой строкой. См. этот пример. Однако, поскольку у меня есть два редактируемых столбца, совместное использование одного объекта TableCellEditor для каждой строки дает очень странные результаты. Я не думаю, что это подходящее решение.

Любые идеи о том, как подойти к этому, будут высоко оценены!

Спасибо!


person Luhar    schedule 08.04.2010    source источник


Ответы (3)


Вы можете решить эту проблему, создав еще один TableCellEditor, который будет делегировать полномочия любому из двух своих субподрядчиков: экземплярам ваших текущих редакторов ячеек. Вам нужно зарегистрировать этот uber-celleditor в столбце и позволить ему делегировать всякий раз, когда он используется Swing.

person Itay Maman    schedule 08.04.2010
comment
Итай - спасибо. Это подход, который я использовал, и он работает хорошо. - person Luhar; 12.04.2010

Я не думаю, что вам нужно связывать TableCellEditor для каждой строки.

Вам нужен только один , который сам будет получать доступ к другим данным. в getTableCellEditor() у вас есть доступ к таблице, а также к координатам (столбец, строка).

При этом вы можете напрямую запросить у таблицы ее значение в нужном столбце для текущей строки.

Имейте в виду, что, как и рендереры, редакторы ячеек являются «общими». Вы действительно просите один и тот же объект предоставить вам компонент редактора (который в большинстве случаев является самим TableCellEditor, например, расширением JFormattedTextField). Таким образом, вам не нужно помещать по одному в строку, будет вызван метод getTableCellEditor() с текущими индексами столбца и строки, и вы предоставите компоненту соответствующий формат в зависимости от условия.

Что-то вроде этого:

public Component getTableCellEditorComponent(JTable table,
                                             Object value,
                                             boolean isSelected,
                                             int row,
                                             int column)
{
    Object data = table.getValueAt(row, CONDITION_COLUMN);
    if (data is something)
        this.setFormat(FORMAT1);
    else
        this.setFormat(FORMAT2);

    return this;
}
person Gnoupi    schedule 08.04.2010

Я бы переопределил метод getCellEditor(...) JTable. Затем вы можете вернуть соответствующий редактор в зависимости от формата данных.

person camickr    schedule 08.04.2010