Java 如何通过按delete键从jTable中删除单元格?

Java 如何通过按delete键从jTable中删除单元格?,java,swing,jtable,Java,Swing,Jtable,我有如下代码。我想按delete键删除单元格。我该怎么做?我还想在该字段中添加删除按钮 private static final long serialVersionUID = -250883760398754970L; private final LinkedList<Product> list= new LinkedList<Product>(); private final LinkedList<Boolean> checkList = new

我有如下代码。我想按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);

}
private static final long serialVersionUID=-250883760398754970L;
private final LinkedList=新建LinkedList();
private final LinkedList checkList=新建LinkedList();
公共无效附加项(产品客户){
列表。添加(客户);
检查表。添加(假);
fireTableDataChanged();
}
@凌驾
public int getColumnCount(){
返回6;
}
@凌驾
public int getRowCount(){
返回list.size();
}
@凌驾
公共对象getValueAt(int行索引、int列索引){
objectobj=null;
如果(columnIndex==4)
{
setTotal(list.get(rowIndex));
}
开关(列索引){
案例0:obj=list.get(rowIndex.getCode();break;
案例1:obj=list.get(rowIndex.getDescription();break;
案例2:obj=list.get(rowIndex.getQuantity();break;
案例3:obj=list.get(rowIndex.getPrice();break;
案例4:obj=list.get(rowIndex.getTotal();break;
}
返回obj;
}
@凌驾
公共类getColumnClass(int arg0){
开关(arg0){
案例0:案例1:返回String.class;
案例2:返回Integer.class;
案例3:案例4:返回Double.class;
}
返回super.getColumnClass(arg0);
}
@凌驾
公共布尔值可编辑(int arg0,int arg1){
布尔值isCellEditable=false;
开关(arg1){
案例2:案例3:isCellEditable=true;中断;
默认值:isCellEditable=false;中断;
}
返回是可编辑的;
//返回super.isCellEditable(arg0,arg1);
}
@凌驾
public void setValueAt(对象arg0、int arg1、int arg2){
System.out.println(“设置值”+arg0+arg1+arg2);
开关(arg2){
案例0:断裂;
案例1:断裂;
案例2:list.get(arg1).setQuantity((整数)arg0);setTotal(list.get(arg1));break;
案例3:list.get(arg1).setPrice((Double)arg0);setTotal(list.get(arg1));break;
案例4:list.get(arg1.setTotal((Double)arg0);break;
//案例0:checkList.set(arg1,(布尔值)arg0);break;
默认:中断;
}
//list.get(arg1).setTotal((双精度)arg0);
fireTableDataChanged();
}
公共链接列表getList(){
LinkedList temp=新建LinkedList();
int指数=-1;
for(选择:检查表){
索引++;
如果(当选){
临时添加(列表获取(索引));
}
}
返回温度;
}
公共无效集合总计(产品){
双总=0.0d;
总计=product.getQuantity()*product.getPrice();
产品。设置总计(总计);
}

这个代码可以吗?谢谢。

您需要将删除键绑定到表

请查看以了解更多详细信息

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

这只是一个例子。只要您的表格模型支持,您可以删除具有相同想法的整行。

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

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

以下代码适用于处于
单选模式的排序的。感谢您提供的密钥绑定

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

对于
setValueAt
@处的非功能性删除/编译器错误,减1,那么我想您是唯一一个。你犯了什么错误?我在许多生产系统中都使用这段代码,所以任何问题都必须与如何使用有关it@BullyWiiPlaza所以,你基本上是在说“我犯了个错误,所以一定是其他人的错!”您不太可能找到任何直接满足您的要求的答案,并且提供的答案与所问问题相关。但是,我一直使用这种类型的功能,通常用于删除行。错误如下:
类型TableModel中的方法setValueAt(Object,int,int)不适用于参数(int,int,null)
。代码行应该是
table.getModel().setValueAt(null,row,col)仍然爱你的贡献,程序员:)