Как использовать JLists в ячейках JTable? - PullRequest
3 голосов
/ 21 февраля 2011

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

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

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

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

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

1 Ответ

7 голосов
/ 24 февраля 2011

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

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();
            }
...