哪个删除JTable行方法更好?

时间:2013-09-06 20:57:07

标签: java swing jtable defaulttablemodel

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

1 个答案:

答案 0 :(得分:2)

问题取决于您的申请的背景。在一个完美的世界中,你的TableModel将来自负责管理数据的某种工厂/控制器的数据建模,这些数据可以读/写某种数据源。

这将允许您的TableModel机会根本不关心数据的来源或去往,只是它有一些方法可以执行这些操作。

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

然后,这提出了一个问题,即谁应该实际执行哪些工作。

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

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

这当然只是我的意见,基于factoryobserverproducer-consumermodel-view-controller模式