Как использовать JLists в ячейках JTable?

Мне нужен простой способ поместить JList в столбец JTable. У меня уже есть JLists и таблица, но при добавлении в таблицу Jlists отображаются как строки, что нормально, потому что я использую DefaultTableModel. Я переопределил getColumnClass() следующим образом:

public Class<? extends Object> getColumnClass(int c)
{
    return getValueAt(0, c).getClass();
}

но это просто форматирует целые числа и значения с плавающей запятой.

Я полагаю, что setValueAt() и getValueAt() также следует переопределить, чтобы возвращать массив строк при вызове JList.getSelectedValues(), но я не могу понять, как это сделать.
Я также хочу, чтобы ячейки можно было редактировать, чтобы пользователи могли выбрать один или несколько вариантов из JList. После редактирования строки я использую кнопку «Сохранить», чтобы сохранить изменения в базе данных, поэтому я не думаю, что мне нужен ListSelectionListener, JList.getSelectedValues() работает отлично.

Я знаю, что это распространенный вопрос, но я не нашел здесь ответа. Если это дубликат, пожалуйста, дайте мне знать, и я удалю его.


person radonys    schedule 21.02.2011    source источник
comment
Узнайте больше о ListCellRenderer и CellEditors и прочитайте этот руководство   -  person Suraj Chandran    schedule 21.02.2011
comment
Спасибо. Я их уже читал.. Я прочитаю их снова и попытаюсь сделать это самостоятельно.   -  person radonys    schedule 21.02.2011


Ответы (1)


Я сделал это. Для всех, кому нужно то же самое, вот что я сделал:

1) Я создал JScrollTableRenderer и установил столбец, который мне нужен, чтобы показать JList для использования этого средства визуализации.

    table.getColumnModel().getColumn(5).setCellRenderer(new JScrollTableRenderer());

Содержимое класса JScrollTableRenderer:

public class JScrollTableRenderer extends DefaultTableCellRenderer {

JScrollPane pane = new JScrollPane();

public JScrollTableRenderer()
{
    super();
}

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
      boolean hasFocus, int row, int column)
{
    pane = (JScrollPane) value;
    return pane;
}
}

2) Я создал JScrollTableEditor и установил столбец, который мне нужен, чтобы показать JList для использования этого редактора.

    table.getColumnModel().getColumn(5).setCellEditor(new JScrollTableEditor());

Содержимое класса JScrollTableEditor:

    public class JScrollTableEditor extends AbstractCellEditor implements TableCellEditor {
    JScrollPane component = new JScrollPane();
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,
          int rowIndex, int vColIndex)
    {
        component = ((JScrollPane) value);
        return ((JScrollPane) value);
    }

    public Object getCellEditorValue()
    {
        return component;
    }

    }

3) Я добавил этот метод в модель JTable:

            public Class<? extends Object> getColumnClass(int c)
            {
                if(c == 5) return JScrollPane.class;
                else return getValueAt(0, c).getClass();
            }
person radonys    schedule 24.02.2011