2010-07-26 8 views
11

JTable 한 열의 다른 셀에 다른 셀 편집기를 사용하고 싶습니다.JTable - 한 열에 여러 셀 편집기가 있습니다.

Name   | Value 
--------------+-------------------------------- 
Identifier | ST33442 (string editor) 
Purchase Date | 7/7/10 (custom calendar editor) 
Status  | Broken (combo editor) 

편집기를 동적으로 빌드하려면 어떻게해야합니까? TableCellEditorFactory과 같은 것이 완벽 할 것입니다.

답변

8

자신 만의 셀 편집기를 구현하고이를 열에 할당해야합니다. 아마도 셀 렌더러에서 동일한 작업을 수행해야합니다 (예를 들어 부울은 "true"/ "false"대신에 체크 상자로 렌더링됩니다).

public class TableEditorTest { 

    public static void main(String[] args) { 
     Object[][] data = new Object[][] {{"Identifier", "ST33442"}, {"Purchase Date", new Date()}, {"Status", Boolean.FALSE}}; 
     String[] columnNames = new String[] {"Name", "Value"}; 
     TableModel model = new DefaultTableModel(data, columnNames); 
     JTable table = new JTable(model); 
     JScrollPane scrollPane = new JScrollPane(table); 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(scrollPane); 
     frame.pack(); 
     frame.setVisible(true); 

     table.getColumnModel().getColumn(1).setCellEditor(new CustomTableCellEditor()); 
    } 

    public static class CustomTableCellEditor extends AbstractCellEditor implements TableCellEditor { 
     private TableCellEditor editor; 

     @Override 
     public Object getCellEditorValue() { 
      if (editor != null) { 
       return editor.getCellEditorValue(); 
      } 

      return null; 
     } 

     @Override 
     public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
      if (value instanceof Date) { 
       editor = new DatePickerCellEditor(); 
      } else if (value instanceof String) { 
       editor = new DefaultCellEditor(new JTextField()); 
      } else if (value instanceof Boolean) { 
       editor = new DefaultCellEditor(new JCheckBox()); 
      } 

      return editor.getTableCellEditorComponent(table, value, isSelected, row, column); 
     } 
    } 
} 

N.B. DatePickerCellEditor is SwingX

1

기본 편집기를 다시 사용하고 싶었 기 때문에 다른 해결책이 있습니다 ... 다음 클래스는 getColumnClass를 다른 대답으로 다시 정의합니다. 지금까지 테스트 해본 결과 괜찮 았고 setDefaultEditor 등을 사용할 수 있습니다. 이 동작을 향상시켜 원하는 열에 만 적용 할 수 있음을 알 수 있습니다.

public class JXMultiTypeColumnTable extends JXTable { 

private Map<Integer, Class<?>> viewedClassByColumn = new HashMap<Integer, Class<?>>(); 

public JXMultiTypeColumnTable(Object[][] rowData, Object[] columnNames) { 
    super(rowData, columnNames); 
} 

public JXMultiTypeColumnTable(int numRows, int numColumns) { 
    super(numRows, numColumns); 
} 

public JXMultiTypeColumnTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm) { 
    super(dm, cm, sm); 
} 

public JXMultiTypeColumnTable(TableModel dm, TableColumnModel cm) { 
    super(dm, cm); 
} 

public JXMultiTypeColumnTable(TableModel dm) { 
    super(dm); 
} 

public JXMultiTypeColumnTable() { 
} 

@Override 
public Class<?> getColumnClass(int column) { 
    Class<?> recordedClass = this.viewedClassByColumn.get(column); 
    if (recordedClass != null) { 
     return recordedClass; 
    } 
    return super.getColumnClass(column); 
} 

private void recordViewedClass(int row, int column) { 
    this.viewedClassByColumn.put(column, 
      this.getModel().getValueAt(
      this.convertRowIndexToModel(row), this.convertColumnIndexToModel(column)) 
      .getClass()); 
} 

@Override 
public TableCellRenderer getCellRenderer(int row, int column) { 
    this.recordViewedClass(row, column); 
    return super.getCellRenderer(row, column); 
} 

@Override 
public TableCellEditor getCellEditor(int row, int column) { 
    this.recordViewedClass(row, column); 
    return super.getCellEditor(row, column); 
} 

}

N.B. JXTable 대신 JTable을 확장 할 수 있습니다.

관련 문제