0

我有两种方法来删除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");
    }
}
4

1 回答 1

2

问题取决于您的应用程序的上下文。在一个完美的世界中,您 TableModel将建模来自某种工厂/控制器的数据,该工厂/控制器负责管理数据,该数据将读取/写入某种数据源。

这将使您TableModel有机会根本不关心数据来自或去往哪里,只关心它有一些执行这些操作的方法。

你的也是如此JTable,它不应该知道数据的来源,只知道它TableModel提供了履行其职责所需的合同。

那么,这就提出了一个问题,即谁应该实际执行什么工作。

在这种情况下,我将为工厂/控制器提供一些方法来提醒注册的侦听器发生变化。这将使 API 解耦,这样程序的任何部分都可以修改工厂/控制器,而无需了解可能正在使用该工厂/控制器的其他所有人,但仍然能够对这些更改做出反应。

所以,我的回答通常都不是......但是......你的第二个最接近实现这一目标,但我担心需要以这种方式从模型中提取数据,但那就是我......

当然,这只是我的观点,基于工厂观察者生产者-消费者模型-视图-控制器模式

于 2013-09-06T21:37:34.887 回答