我有两种方法可以删除JTable
所选行。
我在GUI类中创建了这个方法:
首先:
public void dellAction() {
if (table.getSelectedRow() > -1) {
int rowToDelete = table.getSelectedRow();
int rowToModel = table.convertRowIndexToModel(rowToDelete);
Object rowId = table.getValueAt(rowToModel, 0);
try {
Connection con;
PreparedStatement ps = null;
con = DriverManager.getConnection(...);
ps = con.prepareStatement("delete from table where id=?");
ps.setObject(1, rowId);
if (ps.executeUpdate() == 1) {
model1.removeRow(rowToModel);
}
} catch (SQLException sqle) {
sqle.printStackTrace();
}
} else JOptionPane.showMessageDialog(null, "Select A Row");
}
第二
public void delete(DefaultTableModel model, int modelRow) {
if (table.getSelectedRow() > -1) {
Object rowId = model.getValueAt(modelRow, 0);
try {
Connection con;
PreparedStatement ps = null;
con = DriverManager.getConnection(...);
ps = con.prepareStatement("delete from table where id=?");
ps.setObject(1, rowId);
if (ps.executeUpdate() == 1) {
model.removeRow(modelRow);
}
} catch (SQLException sqle) {
sqle.printStackTrace();
}
} else {
JOptionPane.showMessageDialog(null, "Select A Row");
}
}
答案 0 :(得分:2)
问题取决于您的申请的背景。在一个完美的世界中,你的TableModel
将来自负责管理数据的某种工厂/控制器的数据建模,这些数据可以读/写某种数据源。
这将允许您的TableModel
机会根本不关心数据的来源或去往,只是它有一些方法可以执行这些操作。
同样适合您的JTable
,它应该不知道数据的来源,只是TableModel
提供了履行其职责所需的合同。
然后,这提出了一个问题,即谁应该实际执行哪些工作。
在这种情况下,我会为工厂/控制器提供一些方法来提醒已注册的侦听器更改。这样就可以解决API的问题,即程序的任何部分都可以修改工厂/控制器,而无需了解可能正在使用该工厂/控制器的所有其他人,但仍然能够对这些更改作出反应。
所以,我的回答通常都不是......但是......你的第二个最接近实现这一点,但我担心需要以这种方式从模型中提取数据,但那就是我......
这当然只是我的意见,基于factory,observer,producer-consumer和model-view-controller模式