2013-02-14 88 views
1

這是發佈的問題here的後續操作。JTable列自定義渲染器後不可編輯

我按照答案中的說明操作,它像一個魅力。但是,無法編輯日期列:我無法在填充表中選擇任何JDateChooser

正如前面的問題所述,我使用的是MVC模式。當我從視圖中填充JTablesetCellRenderer時,它工作正常。只有當我填寫並從我的控制器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()); 

如何指定默認editorDate.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(); 
      } 
     }); 
    } 
}