2011-02-21 1 views
3

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

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

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

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

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

+0

Подробнее о [ListCellRenderer] (http://download.oracle.com/javase /1.5.0/docs/api/javax/swing/ListCellRenderer.html) и [CellEditors] (http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/CellEditor.html) и прочитайте это [учебник] (http://download.oracle.com/javase/tutorial/uiswing/components/table.html#renderer) –

+0

Спасибо. Я их уже прочитал. Я буду читать их снова и попытаться сделать это самостоятельно. – radonys

ответ

6

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

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