【问题标题】:JTable Date Column cannot be editedJTable 日期列无法编辑
【发布时间】:2014-08-23 17:14:01
【问题描述】:

我正在使用 NetBeans 8.0 用 Ja​​va 开发桌面应用程序 有一个带有定制表模型的 JTable。但是我能够 编辑具有日期数据类型的列。

下面是代码sn-ps。

   public class DuesTableModel extends AbstractTableModel implements TableModelListener {

 private List<List<Object>> dataList = new ArrayList<>();
 private String[] header = { "ID"," PAYMENT YEAR" , "AMOUNT"};  // Payment year is a date
  datatype

 private int minRowCount = 5;    

  public DuesTableModel()
 { super(); }

 public List<List<Object>> getDataList() { 
    return dataList;
 }

 public void setDataList(List<List<Object>> dataList) {  
    this.dataList = dataList;
    fireTableDataChanged();       
    fireTableStructureChanged();        
 }


 @Override
 public int getRowCount() {
    return Math.max(minRowCount, dataList.size());
  }

  @Override
  public int getColumnCount() {
    return header.length;
  }

  public void setHeader(String[] header) {
    this.header = header;
  }

   public String[] getHeader() {
    return header;
   }

   @Override
  public void setValueAt(Object value, int row, int col)
 {       
  int x = 0;
   for(List<Object> l : dataList)
  {
    if(x == row)
    {  l.set(col, value);}
      x++;        
   }
  fireTableCellUpdated(row,col);    
  }


   @Override
   public Object getValueAt(int rowIndex, int columnIndex) {

     Object value = null;
    if(rowIndex < dataList.size())      
    {value = dataList.get(rowIndex).get(columnIndex);}
    return value;
    }

   @Override
   public String getColumnName(int col) {
   return header[col];
   }


   @Override
   public Class<?> getColumnClass(int column)
    {
        for (int row = 0; row < getRowCount(); row++)
        {   
            Object o = getValueAt(row, column);

            if (o != null)
            {
                return o.getClass();
            }              
        }
        return Object.class;
       }

      @Override
      public boolean isCellEditable(int row, int col) {          
      return true; //col
      }


      @Override
      public void tableChanged(TableModelEvent e) {
      throw new UnsupportedOperationException("Not supported yet."); 
      }

      }

将 isCellEditable 方法设置为 true 后,其他列中的单元格现在可以编辑,除了属于日期数据类型的 Payment Year 列。

欢迎提出任何建议。

【问题讨论】:

    标签: java swing netbeans jtable abstracttablemodel


    【解决方案1】:

    我建议您使用DefaultTableModel 而不是AbstractTableModel 并使用TableCellRenderer 将日期列格式化为yyyy 以仅显示年份。

    示例代码:

    final String[] header = { "ID", " PAYMENT YEAR", "AMOUNT" };
    final Object[][] data = { { "1", new Date(), 500 }, { "2", new Date(), 200 },};
    final DefaultTableModel model = new DefaultTableModel(data, header);
    
    final JTable table = new JTable(model) {
        @Override
        public Class<?> getColumnClass(int column) {
            switch (column) {
                case 1:
                    return Integer.class;
                case 2:
                    return Date.class;
                default:
                    return String.class;
            }
        }
    
        @Override
        public boolean isCellEditable(int row, int col) {
            return true;
        }
    };
    
    TableCellRenderer tableCellRenderer = new DefaultTableCellRenderer() {
    
        SimpleDateFormat f = new SimpleDateFormat("yyyy");
    
        public java.awt.Component getTableCellRendererComponent(JTable table,
                Object value, boolean isSelected, boolean hasFocus,
                int row, int column) {
            if( value instanceof Date) {
                value = f.format(value);
            }
            return super.getTableCellRendererComponent(table, value, isSelected,
                    hasFocus, row, column);
        }
    };
    
    table.getColumnModel().getColumn(1).setCellRenderer(tableCellRenderer);
    

    阅读更多...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 2020-09-24
      • 2019-01-11
      • 2019-04-30
      相关资源
      最近更新 更多