2012-10-20 9 views
6

Tôi có một mã như dưới đây. Tôi muốn xóa ô bằng cách nhấn phím xóa. Làm thế nào tôi có thể làm điều đó? Và tôi cũng muốn thêm nút xóa trong trường đó.Làm thế nào để xóa một ô từ jTable bằng cách nhấn phím DELETE?

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); 

} 

Có thể với mã này không? Cảm ơn bạn.

Trả lời

6

Bạn sẽ muốn ràng buộc phím xóa vào bảng.

Hãy xem How to use Key Bindings để biết thêm chi tiết

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); 
     } 
    } 
}); 

Đây chỉ là một ví dụ. Bạn có thể xóa toàn bộ hàng có cùng ý tưởng, miễn là mô hình bảng của bạn hỗ trợ nó.

+0

trừ 1 cho lỗi xóa/biên dịch phi chức năng tại 'setValueAt' – BullyWiiPlaza

+0

@BullyWiiPlaza Sau đó, tôi đoán bạn là người duy nhất. lỗi gì bạn nhận được? Tôi sử dụng mã chính xác này trong nhiều hệ thống sản xuất, vì vậy bất kỳ vấn đề nào bạn đang gặp phải phải đối mặt với cách bạn đang sử dụng nó – MadProgrammer

+0

@BullyWiiPlaza Vì vậy, về cơ bản bạn đang nói "Tôi gặp lỗi nên đó phải là lỗi của mọi người! " Bạn không thể tìm thấy bất kỳ câu trả lời nào đáp ứng trực tiếp các yêu cầu của bạn một cách chính xác và câu trả lời được cung cấp là ngữ cảnh cho câu hỏi được hỏi. Tuy nhiên, tôi sử dụng loại chức năng này mọi lúc, thông thường để xóa các hàng – MadProgrammer

0

Hàng cuối cùng trong ví dụ trên nên là:

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

Các mã sau đây được sắp xếp làm việc với JTable s có trong chế độ single selection. Nhờ có MadProgrammer cho các ràng buộc chính.

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())); 
     } 
    } 
});