Переключение значений при редактировании ячейки - PullRequest
1 голос
/ 22 июля 2010

У меня есть JTable, который использует пользовательскую TableModel для отображения серии экземпляров объекта. Внутри getValueAt(int row, int column) есть ключ переключения для возврата значений в соответствии с заданными атрибутами (см. Ниже). Один оператор возврата включает в себя возвращение значения 1/0 как true / false.

Есть ли способ изменить эту TableModel, чтобы она отображала 1/0 при редактировании ячейки?

public Object getValueAt(int row, int column) {
    User user = (User)dataVector.get(row);
    switch (column) {
        case ID_INDEX:
           return user.getId();
        case USERNAME_INDEX:
           return user.getUserName();
        case PASSWORD_INDEX:
            return "****";
        case ACTIVATED_INDEX:
            return (user.getActivated())?"true":"false";
        default:
           return new Object();
    }
}

Ответы [ 2 ]

1 голос
/ 22 июля 2010

Вам нужно взглянуть на TableCellRenderer и TableCellEditor:

A TableCellRenderer отвечает за визуализацию данных ячейки, когда она нередактируемый, где TableCellEditor отвечает за предоставление компонента, используемого для редактирования значения ячейки.Таким образом, вы можете представлять данные двумя разными способами в зависимости от того, редактируются они или просто отображаются в соответствии с нормой.

Однако следует учитывать, что если вы возвращаете логический тип из метода getValueAt (), ваш JTableдолжен автоматически отображать JCheckBox, когда ячейка находится в режиме редактирования, значение JCheckBox можно изменить, щелкнув по нему, как обычно.Для этого просто верните:

case ACTIVATED_INDEX:
    return Boolean.valueOf(user.getActivated());
1 голос
/ 22 июля 2010

Рендерер и редактор по умолчанию для Boolean - это JCheckBox. Рассмотрите возможность использования

case ACTIVATED_INDEX:
    return Boolean.valueOf(user.getActivated());

С другой стороны,

case ACTIVATED_INDEX:
    return (user.getActivated())?"1":"0";

Приложение: Например, DefaultTableModel не переопределяет getColumnClass(), а AbstractTableModel просто возвращает Object.class. Ваш TableModel должен переопределить getColumnClass() соответственно:

DefaultTableModel dtm = new DefaultTableModel() {

    @Override
    public Class<?> getColumnClass(int col) {
        return getValueAt(0, col).getClass();
    }
};
// add some data
JTable table = new JTable(dtm);
...