2013-02-14 3 views
1

Это ответ на вопрос, который был отправлен here.JTable Column не редактируется после пользовательского рендеринга

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

Как уже упоминалось в предыдущем вопросе, я использую шаблон MVC. Когда я заполняю JTable и setCellRenderer из представления, он отлично работает. Только когда я заполняю и setCellRenderer с моего контроллера, что столбец даты не включен.

Вот рендер:

public class JDateChooserRenderer extends JDateChooser implements TableCellRenderer{ 

Date inDate; 

@Override 
public Component getTableCellRendererComponent(JTable table, Object value, 
     boolean isSelected, boolean hasFocus, int row, int column) { 
    // TODO Auto-generated method stub 

    if (value instanceof Date){ 
     this.setDate((Date) value); 
    } else if (value instanceof Calendar){ 
     this.setCalendar((Calendar) value); 
    } 
    this.setEnabled(true); 
    return this; 
} 

Вот код с моей точки зрения, которая работает:

scrollPanePermits = new JScrollPane(); 
    tableVehiclePermitHeader = new String[] {"Name", "Expiration Date"}; 
    tableVehiclePermitData = new Object[0][0]; 


    Calendar tempDate = new GregorianCalendar(2008, 1, 1); 
    Date tempDate1 = new Date(2008, 1, 1); 
    tempDate1.setYear(tempDate1.getYear() - 1900); 
    tableVehiclePermitData = new Object [][] {{"Hello", tempDate}, {"Hello", tempDate1}}; 

    tableVehiclePermitDefaultTableModel = new DefaultTableModel(tableVehiclePermitData, tableVehiclePermitHeader); 
    tableVehiclePermit = new JTable(tableVehiclePermitDefaultTableModel){ 
     public Class getColumnClass(int c) { 
      return getValueAt(0, c).getClass(); 
     } 
     @Override 
     public boolean isCellEditable(int rowIndex, int colIndex){ 
      if (colIndex == 0){ 
       return false; 
      } else { 
       return true; 
      } 
     } 
    }; 

    tableVehiclePermit.getColumn("Expiration Date").setCellRenderer(new JDateChooserRenderer()); 
    tableVehiclePermit.getColumn("Expiration Date").setCellEditor(new JDateChooserCellEditor()); 

Наконец, это код из моего контроллера, который заполняет таблицу, но дата колонка не подлежит редактированию:

permitListData = new Object[vehPermit.size()][3]; 
     Iterator it = vehPermit.iterator(); 
     int i = 0; 
     while (it.hasNext()){ 
      permitData = (VehiclePermitExpirationByVehicleDao) it.next(); 
      permitListData[i][0] = permitData.getVehiclePermitName(); 
      permitListData[i][1] = permitData.getExpirationDate(); 
      permitListData[i][2] = permitData.getVehiclePermitId(); 
      i++; 

     } 
     gui.setTableVehiclePermitData(permitListData); 
     gui.getTableVehiclePermitDefaultTableModel().setDataVector(gui.getTableVehiclePermitData(), gui.getTableVehiclePermitHeader()); 
     gui.getTableVehiclePermit().setModel(gui.getTableVehiclePermitDefaultTableModel()); 

//  TableColumn dateColumn = gui.getTableVehiclePermit().getColumnModel().getColumn(1); 
//  dateColumn.setCellRenderer(new JDateChooserRenderer()); 

     gui.getTableVehiclePermit().getColumn("Expiration Date").setCellRenderer(new JDateChooserRenderer()); 

     gui.getTableVehiclePermit().setEnabled(true); 

где gui - это экземпляр моего представления.

Я знаю только о переопределении метода isCellEditable при создании таблицы, чтобы установить ячейки как редактируемые или нет. Любые идеи о том, как это сделать, или о том, что я делаю неправильно?

Любая помощь была бы принята с благодарностью.

ответ

2

Это может помочь приступить к тестированию com.toedter.calendar.demo.DemoTable, как показано ниже. Обратите внимание, как линия

table.setDefaultEditor(Date.class, new JDateChooserCellEditor()); 

определяет по умолчанию editor для модельных значений типа Date.class:

@Override 
public Class getColumnClass(int c) { 
    return getValueAt(0, 1).getClass(); 
} 

image

import com.toedter.calendar.demo.DemoTable; 
import java.awt.EventQueue; 
import java.awt.GridLayout; 
import javax.swing.JFrame; 

/** @see http://stackoverflow.com/a/14880675/230513 */ 
public class TableTest { 

    private void display() { 
     JFrame f = new JFrame("TableTest"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new DemoTable()); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TableTest().display(); 
      } 
     }); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^