Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > TableModel, JTable изменение видимого содержимого


Автор: soulcub 22.5.2010, 00:23
У меня есть JTable, в котором хранятся некие данные. Как сделать так, чтоб в ячейке отображалось значение, которое я задал, а на самом деле в ячейке значение было другое? Ну, например если у меня в ячейке boolean-овское значение, нужно чтоб при true в ячейке отображалось слово "Выполнено", а при false, "Не выполнено". Спасибо заранее.

Автор: pathfinder 22.5.2010, 09:37
Можно, через собственный TableCellRenderer

Код

public class CustomBooleanRenderer extends JLabel implements TableCellRenderer {

        private Border emptyBorder = new EmptyBorder(1, 1, 1, 1);

        public CustomBooleanRenderer() {
            setOpaque(true);
        }

        @Override
        public Component getTableCellRendererComponent(
                JTable table,
                Object value,
                boolean isSelected,
                boolean hasFocus,
                int row, int column)
        {
            setText(value == null || !((Boolean) value) ? "Не выполнено" : "Выполнено");
            
            if (isSelected) {
                setForeground(table.getSelectionForeground());
                setBackground(table.getSelectionBackground());
            } else {
                setForeground(table.getForeground());
                setBackground(table.getBackground());
            }

            if (hasFocus) {
                setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
            } else {
                setBorder(emptyBorder);
            }

            return this;
        }

    }


цепляем его к конкретной колонке
Код

jTable1.getColumnModel().getColumn(/* ваша колонка */).setCellRenderer(new CustomBooleanRenderer());

Автор: aleksandy 22.5.2010, 13:53
Зачем тут CellRenderer? Достаточно просто переопределить метод getValueAt(int, int) в модели таблицы.

Автор: dorogoyIV 22.5.2010, 14:41
Цитата(aleksandy @  22.5.2010,  13:53 Найти цитируемый пост)
Зачем тут CellRenderer? Достаточно просто переопределить метод getValueAt(int, int) в модели таблицы.

 smile  не подходит, т.к. 
Цитата(soulcub @  22.5.2010,  00:23 Найти цитируемый пост)
чтоб в ячейке отображалось значение, которое я задал, а на самом деле в ячейке значение было другое

за отображение отвечает рендерер

Автор: soulcub 23.5.2010, 10:43
dorogoyIV, супер, всё работает=) Теперь осталось только разобраться, как..) Сейчас ещё хочу сделать чтоб этот boolean был в ComboBox-е и чтоб его можно было менять) Надеюсь сам найду, но если не тяжело, может подскажите как это сделать?) Наверняка не через рендерер? 

Я вот уже даже сделал ComboBox) Осталось вставить его вместо ячейки) 

Всё, ладно) Мне самому интересно разобраться) Спасибо за помощь) Если будут проблемы - создам тогда новую тему=) А эту - закрываю)

Автор: aleksandy 24.5.2010, 07:45
Цитата(dorogoyIV @ 22.5.2010,  14:41)
 smile  не подходит, т.к. 
Цитата(soulcub @  22.5.2010,  00:23 Найти цитируемый пост)
чтоб в ячейке отображалось значение, которое я задал, а на самом деле в ячейке значение было другое

Код

public Object getValueAt(int rowIndex, int columnIndex) {
  Boolean v = rows.get(rowIndex).get(columnIndex);
  if (v != null) {
    return v.booleanValue() ? "Выполнено" : "Не выполнено";
  }
  return "";
}

Автор: dorogoyIV 25.5.2010, 08:58
aleksandy, возвращает string, а надо boolean

Автор: aleksandy 26.5.2010, 07:20
dorogoyIV, согласен. Был не прав.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)