У меня есть JTable, который использует пользовательский TableModel для отображения серии экземпляров объектов. Внутри существует случай переключателя getValueAt(int row, int column)
возвращать значения согласно данным атрибутам (см. ниже). Один оператор возврата включает возвращение значения 1/0 как истинное/ложное.
Существует ли способ, которым я могу изменить этот 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();
}
}
Рендерер и редактор по умолчанию для 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);
Вам нужно взглянуть на TableCellRenderer
и TableCellEditor
:
A TableCellRenderer
отвечает за отображение данных ячеек когда он не редактируется, тогда как TableCellEditor
отвечает за предоставление компонента, используемого для редактирования значения ячейки.Таким образом, вы можете представить данные двумя разными способами в зависимости от того, редактируются они или просто отображаются как обычно.
Однако вы должны учитывать, что если вы возвращаете логический тип из метода getValueAt (), ваш JTable должен автоматически отображать JCheckBox, когда ячейка находится в режиме редактирования, значение JCheckBox можно изменить, щелкнув по нему как обычно. Для этого просто вернитесь:
case ACTIVATED_INDEX:
return Boolean.valueOf(user.getActivated());