2012-10-20 12 views
6

Ho un codice come sotto. Voglio cancellare la cella premendo un tasto di cancellazione. Come lo posso fare? E voglio anche aggiungere il pulsante Elimina in quel campo.Come eliminare una cella da jTable premendo il tasto CANC?

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

} 

E 'possibile con questo codice? Grazie.

risposta

6

Si desidera associare il tasto di cancellazione alla tabella.

Date un'occhiata a How to use Key Bindings per maggiori dettagli

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

Questo è solo un esempio. È possibile eliminare un'intera riga con la stessa idea, purché supportata dal modello di tabella.

+0

meno 1 per la cancellazione errori non funzionale/compilatore a 'setValueAt' – BullyWiiPlaza

+0

@BullyWiiPlaza Poi credo che tu sei l'unico. Che errore stai ottenendo? Io uso questo codice esatto in molti sistemi di produzione, quindi qualsiasi problema tu debba avere con il modo in cui lo stai usando – MadProgrammer

+0

@BullyWiiPlaza Quindi, stai praticamente dicendo "Ho ricevuto un errore, quindi deve essere colpa di tutti! " È improbabile che tu trovi una risposta che soddisfi esattamente le tue esigenze esattamente e che la risposta fornita sia contestuale alla domanda posta. Tuttavia, utilizzo sempre questo tipo di funzionalità, normalmente per eliminare le righe – MadProgrammer

0

L'ultima riga nell'esempio sopra dovrebbe essere:

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

Il seguente codice funziona con ordinate JTable s che sono in modalità single selection. Grazie a MadProgrammer per le associazioni di tasti.

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