我目前有 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()
:更改后的单元格发生了什么:- 如果数据行已插入:
e.getType() == TableModelEvent.INSERT
- 如果数据行删除:
e.getType() == TableModelEvent.DELETE
- 如果数据行已更新:
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
处的列名称。
教程:
关于java - 如何插入、更新和删除从 (SQLite) 数据库加载的 JTable 中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19754752/