java - 如何插入、更新和删除从 (SQLite) 数据库加载的 JTable 中的项目

标签 java database swing sqlite jtable

我目前有 2 个类,一个显示 GUI,一个是从数据库中获取项目。我的代码如下:

此代码用于在我的 GUI 中显示 JTable

public void table() {
    if(SOMR.tableCall() == true) {
        this.columnNames = SOMR.getCol();
        this.data = SOMR.getData();
    JTable table = new JTable(data, columnNames)
    {
        public Class getColumnClass(int column)
        {

            for (int row = 0; row < getRowCount(); row++)
            {
                Object o = getValueAt(row, column);

                if (o != null)
                {
                    return o.getClass();
                }
            }

            return Object.class;
        }
    };

    JScrollPane scrollPane = new JScrollPane( table );
    add( scrollPane, BorderLayout.CENTER );
    }

}

这段代码是检索项目并将它们传递给上面的代码,以将检索到的项目显示到JTable

public boolean table() {

    Connection connection = null;  
     ResultSet resultSet = null;  
     PreparedStatement preparedStatement = null;  
     try 
     {  
         Class.forName("org.sqlite.JDBC");  
         connection = DriverManager.getConnection("jdbc:sqlite:db");
         preparedStatement = connection.prepareStatement("SELECT item1, item2, item3 FROM menu WHERE can = ? AND id = ?");
         preparedStatement.setInt(1, can);
         preparedStatement.setInt(2, id);
         resultSet =  preparedStatement.executeQuery();
         ResultSetMetaData md = resultSet.getMetaData();
         columns = 3;//md.getColumnCount();
         for(int i = 1; i<=columns; i++) {
             columnNames.addElement(md.getColumnName(i));
         }
         while(resultSet.next()) {
             row = new Vector(columns);
             for (int i = 1; i<=columns; i++) {
                 row.addElement(resultSet.getObject(i));
             }
             data.addElement(row);
         }
         tablecall = true;
         return tablecall;
     }
     catch (Exception ex) 
     {  
         tablecall = false;
         ex.printStackTrace();  
     }
     finally 
     {  
         try 
         {  
             resultSet.close();  
             preparedStatement.close();  
             connection.close();  
         } 
         catch (Exception ex) 
         {  
             ex.printStackTrace();  
         }  
     }
    return tablecall;
}

我遵循了从Table From Database 显示JTable 的方式。 ,但是我真的不知道如何从 JTable 中插入、更新和删除一行并在数据库中更新,然后刷新 JTable 以从新更新的数据库中显示。

我想添加一个“添加项目”按钮,然后它会弹出一个框架/窗口,其中包含要输入的字段,然后在弹出框架中单击“添加”后,JTable 和数据库将同时更新时间。

谁能帮我解决这个问题?我迷路了..非常感谢!

最佳答案

我仍然不清楚您的要求,但让我们开始尽可能多地回答:

每个JTable 对象都使用表模型对象来管理实际的表数据。表模型对象必须实现 TableModel 接口(interface)。但是 DefaultTableModel 本身足以处理表数据交互。查看它的 java doc了解更多详情。

但是,要检测由表 model 对象管理的数据的更改,与 JTable 实例关联的 model 需要注册到使用 addTableModelListener() 函数实现 TableModelListener 接口(interface)。监听器将收到事件 TableModelEvent e 的通知,以检查数据行的更改和更改类型,使用:

  • e.getFirstRow():返回第一行发生变化的索引,包括由TableModelEvent.HEADER_ROW指定的表头
  • e.getLastRow():更改的最后一行
  • e.getType():更改后的单元格发生了什么:
    1. 如果数据行已插入:e.getType() == TableModelEvent.INSERT
    2. 如果数据行删除:e.getType() == TableModelEvent.DELETE
    3. 如果数据行已更新:e.getType() == TableModelEvent.UPDATE。

一个简短的例子:

model.addTableModelListener(new TableModelListener() {

     @Override
     public void tableChanged(TableModelEvent e) {
          int rowFirstIndex = e.getFirstRow();
          int rowLastIndex = e.getLastRow();

          DefaultTableModel model = (DefaultTableModel) e.getSource();
           if(e.getType()==TableModelEvent.UPDATE)
            {
                int updatedColIndex = e.getColumn();
                String updateColmn = table.getColumnName(updatedColIndex);
                String updatedValue = (String) model.getValueAt(rowFirstIndex, updatedColIndex);
                System.out.println("column: "+updateColmn+" value: "+updatedValue);
                updateDB(updateColmn, updatedValue);
            }

            else if(e.getType()==TableModelEvent.INSERT)
            {
             for(int i= rowFirstIndex; i <= rowLastIndex ; i++)  
              {   
                  Vector rowData = (Vector) model.getDataVector().get(i);

                  Map<String, String>dataMap = new HashMap<>();

                  for(int j=0; j < rowData.size() ; j++)
                    dataMap.put(table.getColumnName(j), (String) rowData.get(j));

                  InsertToDB(dataMap); // now it contains columndName corresponding to row value

              }
          }
         }
     });

编辑(根据您的评论):我得到 [value1, value2, value3]。我如何将它与我的 SQL 语句一起使用?

如果您有兴趣将行值与列名进行映射,就像构建 SQL 查询语法的情况一样:vector 包含维护 column 索引的行数据.即 row.get(i) 具有列索引为 i 的数据。您可以使用 table.getColumnName(i) 获取与索引 i 处的行 vector 值相对应的索引 i 处的列名称。

教程:

  1. How to write a table model listener

关于java - 如何插入、更新和删除从 (SQLite) 数据库加载的 JTable 中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19754752/

相关文章:

mysql - 来自同一个表的多个外键

java - 为什么不能在 'if statement' 之外访问 java 中 'if statement' 内部的值?

java - 在 kotlin 中使用 java 自定义注解

sql-server - 根据历史表创建日期范围报告

java - JComboBox 中的项目居中,并且在禁用时清晰地显示文本

java - ScrollPane 内的 JTable 仅在调整大小后显示

java - 多个单选按钮的 Action 监听器

java - 将过时的存储类转换为更新的类

java - 使用 SWT.MULTI 获取表的选定行

php - 一次将两个表中的信息读取为两种形式