2012-10-20 38 views
6

我有一个像下面的代码。我想通过按删除键删除单元格。我怎样才能做到这一点?而且我还想在该字段中添加删除按钮。如何通过按DELETE键从jTable中删除单元格?

private static final long serialVersionUID = -250883760398754970L; 
private final LinkedList<Product> list= new LinkedList<Product>(); 
    private final LinkedList<Boolean> checkList = new LinkedList<Boolean>(); 
    public void addItem(Product customer) { 
    list.add(customer); 
    checkList.add(false); 
    fireTableDataChanged(); 

} 
@Override 
public int getColumnCount() { 
     return 6; 
} 

@Override 
public int getRowCount() { 
    return list.size(); 

} 

@Override 
public Object getValueAt(int rowIndex, int columnIndex) { 
    Object obj = null; 

    if(columnIndex==4) 
     { 
    setTotal(list.get(rowIndex)); 
    } 
      switch (columnIndex){ 
     case 0: obj= list.get(rowIndex).getCode() ;break; 
     case 1: obj=list.get(rowIndex).getDescription(); break; 
     case 2: obj=list.get(rowIndex).getQuantity();break; 
     case 3: obj=list.get(rowIndex).getPrice();break;    
     case 4: obj=list.get(rowIndex).getTotal();break; 
    } 
    return obj; 
} 
    @Override 
public Class<?> getColumnClass(int arg0) { 

    switch(arg0){ 
    case 0: case 1: return String.class; 
    case 2: return Integer.class; 
    case 3: case 4: return Double.class; 
    } 

    return super.getColumnClass(arg0); 
} 
@Override 
public boolean isCellEditable(int arg0, int arg1) { 
    boolean isCellEditable = false; 
    switch(arg1){ 
    case 2: case 3: isCellEditable= true;break; 
    default: isCellEditable= false;break; 
    } 
    return isCellEditable; 
    //return super.isCellEditable(arg0, arg1); 
} 


@Override 

public void setValueAt(Object arg0, int arg1, int arg2) { 
    System.out.println("Value seted" +arg0 + arg1 + arg2); 


    switch(arg2){ 
    case 0: break; 
    case 1: break; 
    case 2: list.get(arg1).setQuantity((Integer)arg0);    setTotal(list.get(arg1)); break; 
    case 3: list.get(arg1).setPrice((Double)arg0); setTotal(list.get(arg1));break;   
    case 4: list.get(arg1).setTotal((Double)arg0);break; 



     //case 0: checkList.set(arg1, (Boolean)arg0);break; 
     default:break; 
    } 
    //list.get(arg1).setTotal((Double)arg0); 
    fireTableDataChanged(); 
} 



public LinkedList<Product> getList() { 
    LinkedList<Product> temp = new LinkedList<Product>(); 
    int index=-1; 
    for(Boolean isSelected:checkList){ 
     index++; 
     if(isSelected){ 
      temp.add(list.get(index)); 
     } 
    } 
    return temp; 
} 


public void setTotal(Product product){ 
    Double total = 0.0d; 
    total = product.getQuantity()* product.getPrice(); 
    product.setTotal(total); 

} 

这段代码可能吗?谢谢。

回答

6

您需要将删除键绑定到表。

看看How to use Key Bindings更多细节

InputMap inputMap = table.getInputMap(WHEN_FOCUSED); 
ActionMap actionMap = table.getActionMap(); 

inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), "delete"); 
actionMap.put("delete", new AbstractAction() { 
    public void actionPerformed(ActionEvent evt) { 
     // Note, you can use getSelectedRows() and/or getSelectedColumns 
     // to get all the rows/columns that have being selected 
     // and simply loop through them using the same method as 
     // described below. 
     // As is, it will only get the lead selection 
     int row = table.getSelectedRow(); 
     int col = table.getSelectedColumn(); 
     if (row >= 0 && col >= 0) { 
      row = table.convertRowIndexToModel(row); 
      col = table.convertColumnIndexToModel(col); 
      table.getModel().setValueAt(null, row, col); 
     } 
    } 
}); 

这仅仅是一个例子。只要你的表模型支持它,你可以用同样的想法删除整行。

+0

减去1的非功能性缺失/编译器错误的'setValueAt' – BullyWiiPlaza

+0

@BullyWiiPlaza然后,我想你是唯一的一个。你遇到了什么错误?我在许多生产系统中使用这个确切的代码,所以你遇到的任何问题必须与你如何使用它 – MadProgrammer

+0

@BullyWiiPlaza所以,你基本上说“我有一个错误,所以它必须是其他人的错! “您不可能找到任何直接满足您要求的答案,并且所提供的答案与问题的背景相关。但是,我始终使用这种类型的功能,通常删除行 – MadProgrammer

0

在上面的例子中的最后一行应该是:

table.getModel().setValueAt(null, row, col); 
0

下面的代码工作与排序JTable s表示在single selection模式。感谢MadProgrammer的关键绑定。

table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 

InputMap inputMap = table.getInputMap(WHEN_FOCUSED); 
ActionMap actionMap = table.getActionMap(); 

String deleteAction = "delete"; 
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), 
     deleteAction); 
actionMap.put(deleteAction, new AbstractAction() 
{ 
    public void actionPerformed(ActionEvent deleteEvent) 
    { 
     if (table.getSelectedRow() != -1) 
     { 
      tableModel.removeRow(table.convertRowIndexToModel(table.getSelectedRow())); 
     } 
    } 
}); 
相关问题