我想从JTable中删除一些行。我该怎么办?
答案 0 :(得分:34)
要从JTable中删除行,您需要从基础TableModel中删除目标行。例如,如果您的TableModel是DefaultTableModel的实例,则可以通过执行以下操作来删除行:
((DefaultTableModel)myJTable.getModel()).removeRow(rowToRemove);
答案 1 :(得分:8)
如果您需要一个简单的工作解决方案,请尝试使用DefaultTableModel。
如果您已经创建了自己的表模型,它扩展了AbstractTableModel,那么您还应该实现removeRow()方法。确切的实现取决于您用于存储数据的底层结构。
例如,如果您使用过Vector,那么它可能是这样的:
public class SimpleTableModel extends AbstractTableModel {
private Vector<String> columnNames = new Vector<String>();
// Each value in the vector is a row; String[] - row data;
private Vector<String[]> data = new Vector<String[]>();
...
public String getValueAt(int row, int col) {
return data.get(row)[col];
}
...
public void removeRow(int row) {
data.removeElementAt(row);
}
}
如果您使用过List,那么它将非常相似:
// Each item in the list is a row; String[] - row data;
List<String[]> arr = new ArrayList<String[]>();
public void removeRow(int row) {
data.remove(row);
}
HashMap中:
//Integer - row number; String[] - row data;
HashMap<Integer, String[]> data = new HashMap<Integer, String[]>();
public void removeRow(Integer row) {
data.remove(row);
}
如果你使用像这样的数组
String[][] data = { { "a", "b" }, { "c", "d" } };
然后你运气不好,因为没有办法从数组中动态删除元素。您可以尝试通过单独存储一些标志来通知哪些行被删除,哪些不是,或者通过其他一些狡猾的方式,但我建议反对它...这将引入不必要的复杂性,实际上只是< em>通过创建另一个来解决问题。这是结束here的可靠方法。请尝试使用上述方法之一来存储表格数据。
为了更好地了解其工作原理,以及如何使自己的模型正常运行,我强烈建议您参考Java Tutorial,DefaultTableModel API并且它是source code
答案 2 :(得分:4)
将过滤器应用于JTable的正确方法是通过添加到TableRowSorter的RowFilter接口。使用此界面,可以在不更改基础模型的情况下更改模型视图。这种策略保留了模型 - 视图 - 控制器范例,而删除您希望从模型中隐藏的行本身会因混淆您的关注点而打破范式。
答案 3 :(得分:3)
JTable通常构成MVC实现的View部分。您需要从模型中删除行。应该监听这些更改的JTable将更新以反映此删除。因此,您不会在JTable上找到removeRow()或类似方法。
答案 4 :(得分:3)
查看DefaultTableModel以获取可以使用的简单模型:
http://java.sun.com/javase/6/docs/api/javax/swing/table/DefaultTableModel.html
这扩展了AbstractTableModel,但应该足以满足基本目的。您始终可以扩展AbstractTableModel并创建自己的。确保你也在JTable上设置它。
http://java.sun.com/javase/6/docs/api/javax/swing/table/AbstractTableModel.html
查看基本的Sun教程,了解有关将JTable与表模型一起使用的更多信息:
http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#data
答案 5 :(得分:3)
mmm非常简单
for( int i = model.getRowCount() - 1; i >= 0; i-- )
{
model.removeRow(i);
}