Jtable - 编辑后获取 table 单元格数据
Jtable - Get table cell data after edit
我有一个包含来自数据库的数据的 JTable。我可以使用
提取当前在 table 中的数据
table.getValueAt(table.getSelectedRow(),3)
我想不通的是如何在 运行 App 中编辑后获取同一单元格的新数据。我已经尝试 运行 更新 SQL 命令来推送新数据,但它没有更新。我想我错过了一步。我也尝试过 TableModelListener 但我运气不好让它按我需要的那样工作。这是我目前协助检索和更新数据的内容:
private void UpdateDbFromJTable(){
table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
@Override
public void valueChanged(ListSelectionEvent event) {
if (table.getSelectedRow() > -1) {
// print first column value from selected row
String App = table.getValueAt(table.getSelectedRow(),0).toString();
String Version = table.getValueAt(table.getSelectedRow(),1).toString();
String Issue = table.getValueAt(table.getSelectedRow(),2).toString();
String Resolved =table.getValueAt(table.getSelectedRow(),3).toString();
try {
String sql = "UPDATE Bugs SET Resolved =" + Resolved + "WHERE App = \" " + App + "' AND Version =\"" + Version + "\" AND Issue = \"" + Issue + "\"";
conn = DriverManager.getConnection(DB_URL);
stmt = conn.prepareStatement(sql);
rs = stmt.executeUpdate();
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}
}
}
});
}
Update 语句此时不正确,因为它只是将 "Resolved" 更新为数据库中已设置的内容。
这就是我已更正更新后发生的情况。在对不同的 table 条目进行更改后,每次单击“保存”时,我都会得到重复的 'println'(s):
私人无效 UpdateDbFromJTable(){
table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
@Override
public void valueChanged(ListSelectionEvent event) {
String App = null;
String Version = null;
String Issue = null;
String Resolved = null;
if (! event.getValueIsAdjusting())
{
if (table.getSelectedRow() > -1) {
// print first column value from selected row
App = table.getValueAt(table.getSelectedRow(),0).toString();
Version = table.getValueAt(table.getSelectedRow(),1).toString();
Issue = table.getValueAt(table.getSelectedRow(),2).toString();
Resolved =table.getValueAt(table.getSelectedRow(),3).toString();
System.out.println(App + " " + Version + " " + Issue + " " + Resolved);
}
}
if(table.isEditing()){
table.getCellEditor().stopCellEditing();
try {
conn = DriverManager.getConnection(DB_URL);
String sql = "UPDATE Bugs SET Resolved = ? WHERE App = ? AND Version = ? AND Issue = ?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, Resolved);
stmt.setString(2, App);
stmt.setString(3, Version);
stmt.setString(4, Issue);
stmt.executeUpdate();
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}
}
}
});
}
我的保存按钮:
btnSave.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
UpdateDbFromJTable();
JTable();
}
});
还有我的 JTable():
Connection conn = null;
ResultSet rs = null;
PreparedStatement stmt = null;
private JTable table;
private void JTable() {
String sql = "SELECT * FROM Bugs";
try {
conn = DriverManager.getConnection(DB_URL);
stmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
table.setModel(DbUtils.resultSetToTableModel(rs));
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}
}
您可以尝试添加 TableModelListener
这种方式,一旦 table 发生变化就会执行。类似于:
tableModel.addTableModelListener(new TableModelListener(){
@Override
public void tableChanged(TableModelEvent tableModelEvent) {
if(table.isEditing())
String value = table.getValueAt(table.getSelectedRow(),3);
//do stuff with value
}
});
我猜您的编辑器仍处于活动状态,因此数据尚未保存到模型中。
因此您需要在 ActionListener 中停止编辑:
if (table.isEditing())
table.getCellEditor().stopCellEditing();
查看 Table Stop Editing 了解更多信息和另一种方法
此外,为您的 SQL 使用 PreparedStatment
它更易于维护且不易出错:
String sql = "UPDATE Page SET Title = ? WHERE Name = ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString( 1, "update" );
stmt.setString( 2, "Name3" );
stmt.executeUpdate();
stmt.close();
感谢@camickr 指出它正在创建多个侦听器,我终于弄清楚了为什么它会重复。我在按钮本身周围移动了监听器。
table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent event) {
if (!event.getValueIsAdjusting()) {
if (table.getSelectedRow() > -1) {
// print first column value from selected row
app = table.getValueAt(table.getSelectedRow(), 0).toString();
version = table.getValueAt(table.getSelectedRow(), 1).toString();
issue = table.getValueAt(table.getSelectedRow(), 2).toString();
resolved = table.getValueAt(table.getSelectedRow(), 3).toString();
System.out.println(app + " " + version + " " + issue + " " + resolved);
}
}
btnSave.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
updateDbFromJTable();
//jTable();
}
});
}
});
我有一个包含来自数据库的数据的 JTable。我可以使用
提取当前在 table 中的数据table.getValueAt(table.getSelectedRow(),3)
我想不通的是如何在 运行 App 中编辑后获取同一单元格的新数据。我已经尝试 运行 更新 SQL 命令来推送新数据,但它没有更新。我想我错过了一步。我也尝试过 TableModelListener 但我运气不好让它按我需要的那样工作。这是我目前协助检索和更新数据的内容:
private void UpdateDbFromJTable(){
table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
@Override
public void valueChanged(ListSelectionEvent event) {
if (table.getSelectedRow() > -1) {
// print first column value from selected row
String App = table.getValueAt(table.getSelectedRow(),0).toString();
String Version = table.getValueAt(table.getSelectedRow(),1).toString();
String Issue = table.getValueAt(table.getSelectedRow(),2).toString();
String Resolved =table.getValueAt(table.getSelectedRow(),3).toString();
try {
String sql = "UPDATE Bugs SET Resolved =" + Resolved + "WHERE App = \" " + App + "' AND Version =\"" + Version + "\" AND Issue = \"" + Issue + "\"";
conn = DriverManager.getConnection(DB_URL);
stmt = conn.prepareStatement(sql);
rs = stmt.executeUpdate();
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}
}
}
});
}
Update 语句此时不正确,因为它只是将 "Resolved" 更新为数据库中已设置的内容。
这就是我已更正更新后发生的情况。在对不同的 table 条目进行更改后,每次单击“保存”时,我都会得到重复的 'println'(s): 私人无效 UpdateDbFromJTable(){
table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
@Override
public void valueChanged(ListSelectionEvent event) {
String App = null;
String Version = null;
String Issue = null;
String Resolved = null;
if (! event.getValueIsAdjusting())
{
if (table.getSelectedRow() > -1) {
// print first column value from selected row
App = table.getValueAt(table.getSelectedRow(),0).toString();
Version = table.getValueAt(table.getSelectedRow(),1).toString();
Issue = table.getValueAt(table.getSelectedRow(),2).toString();
Resolved =table.getValueAt(table.getSelectedRow(),3).toString();
System.out.println(App + " " + Version + " " + Issue + " " + Resolved);
}
}
if(table.isEditing()){
table.getCellEditor().stopCellEditing();
try {
conn = DriverManager.getConnection(DB_URL);
String sql = "UPDATE Bugs SET Resolved = ? WHERE App = ? AND Version = ? AND Issue = ?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, Resolved);
stmt.setString(2, App);
stmt.setString(3, Version);
stmt.setString(4, Issue);
stmt.executeUpdate();
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}
}
}
});
}
我的保存按钮:
btnSave.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
UpdateDbFromJTable();
JTable();
}
});
还有我的 JTable():
Connection conn = null;
ResultSet rs = null;
PreparedStatement stmt = null;
private JTable table;
private void JTable() {
String sql = "SELECT * FROM Bugs";
try {
conn = DriverManager.getConnection(DB_URL);
stmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
table.setModel(DbUtils.resultSetToTableModel(rs));
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}
}
您可以尝试添加 TableModelListener
这种方式,一旦 table 发生变化就会执行。类似于:
tableModel.addTableModelListener(new TableModelListener(){
@Override
public void tableChanged(TableModelEvent tableModelEvent) {
if(table.isEditing())
String value = table.getValueAt(table.getSelectedRow(),3);
//do stuff with value
}
});
我猜您的编辑器仍处于活动状态,因此数据尚未保存到模型中。
因此您需要在 ActionListener 中停止编辑:
if (table.isEditing())
table.getCellEditor().stopCellEditing();
查看 Table Stop Editing 了解更多信息和另一种方法
此外,为您的 SQL 使用 PreparedStatment
它更易于维护且不易出错:
String sql = "UPDATE Page SET Title = ? WHERE Name = ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString( 1, "update" );
stmt.setString( 2, "Name3" );
stmt.executeUpdate();
stmt.close();
感谢@camickr 指出它正在创建多个侦听器,我终于弄清楚了为什么它会重复。我在按钮本身周围移动了监听器。
table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent event) {
if (!event.getValueIsAdjusting()) {
if (table.getSelectedRow() > -1) {
// print first column value from selected row
app = table.getValueAt(table.getSelectedRow(), 0).toString();
version = table.getValueAt(table.getSelectedRow(), 1).toString();
issue = table.getValueAt(table.getSelectedRow(), 2).toString();
resolved = table.getValueAt(table.getSelectedRow(), 3).toString();
System.out.println(app + " " + version + " " + issue + " " + resolved);
}
}
btnSave.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
updateDbFromJTable();
//jTable();
}
});
}
});