2012-12-14 49 views
2

我想使用按钮从JTable使用AbstractTableModel删除选定的行。使用AbstractTableModel从JTable删除行

下面的代码使用的DefaultTableModel:

... 
MyTableModel mtb; 
... 
private String[].... 
private Object[][]... 
... 
JTable table = new JTable(mtb) 
JButton delete; 
... 
public void actionPerformed(ActionEvent e) { 

     if(e.getSource().equals(delete)) 
     { 
       if(table.getSelectedRow()<0) 
       { 
        JOptionPane.showMessageDialog(this,"Select row"); 

       } 
       else 
       { 
        mtb.removeRow(table.getSelectedRow()); 

       } 
     } 
    } 

但deosn't工作,AbstractTablemodel

我有一点点混乱中我的代码,所以这里是Oracle页java example可用于:

谢谢!

+2

由于未定义该方法,所以不起作用。只需将这种方法添加到“TableModel”中,并确保该方法激发适当的事件。请注意,您的问题中的代码对于提出解决方案而言并不相关。我们需要你的'TableModel'和'actionPerformed'方法来给出有用的建议 – Robin

+0

好吧,我认为有一个类似的定义方法,因为它在DefaultTableModel中,但现在我知道我需要定义它。谢谢。 – TheSpaceboy0

回答

4

AbstractTableModel,你必须实现自己的removeRow()基于模型的内部数据结构(一个或多个),但你可以学习的DefaultTableModel源作为其活动事件的指导火灾。例如,

public void removeRow(int row) { 
    // remove a row from your internal data structure 
    fireTableRowsDeleted(row, row); 
} 
+0

我发现了更多相关的提示:“向现有数组添加数据并不容易,您必须创建一个比旧数组大的新数组,然后将所有数据复制,然后添加新项目。使用Vector或ArrayList“。 – TheSpaceboy0

+1

*我发现了更多相关的提示*我们的魔法水晶球可能未能显示您使用阵列作为内部数据结构。 +1这个答案是关于最好的人可以用 – Robin

+0

这个问题中的可用信息做的尽管不被弃用,但Vector是一个遗留类。考虑编码到界面,例如'List ',它可以让你根据需要改变实现 – trashgod

2

DefaultTableModel会自称fireXX方法每当有表格模型的变化。但是如果我们使用AbstractTableModel那么我们必须明确地调用fireXX方法。所以当表中有变化时,只需调用相关的fireXX方法即可。

因为,

插入新行表使用fireTableRowsInserted

删除(你的情况)使用fireTableRowsDeleted

更新使用fireTableRowsUpdated

注意:DefaultTableModel拥有大部分的实施方法。所以除非有真正的需求,否则AbstractTableModel其他坚持DefaultTableModel