gpt4 book ai didi

java - 将行插入数据库后 JTable 不更新

转载 作者:行者123 更新时间:2023-11-29 12:07:32 25 4
gpt4 key购买 nike

我想不断更新我的JTable每当一行或多行插入到 MYSQL 数据库时。

我填写了我的JTable使用 tableModel() 与数据库中已有的数据进行比较方法,以及changed()更新我的方法 JTable如果将新行插入数据库。

我试过fireTableDataChanged() , setModel()repaint()关于JTable在我的里面change()方法,但它没有做任何事情。

下面是我的代码:

import java.awt.BorderLayout;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import com.mysql.jdbc.ResultSetMetaData;

@SuppressWarnings("serial")
public class Test extends JPanel{
private JPanel panel;
private JTable table;
private JScrollPane pane;

public Test() {

setLayout(new BorderLayout());
panel = new JPanel(new BorderLayout());
try {
table = new JTable(tableModel());
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

changed(table);
pane = new JScrollPane(table);
panel.add(pane);
add(panel, BorderLayout.CENTER);
}

public DefaultTableModel tableModel() throws SQLException {
ResultSet rs = null;
Connection myConn = null;

try {
//connect to database
myConn = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo","root","abcd");

//Create SQL statement
Statement stmt = (Statement) myConn.createStatement();

//Execute Query
rs = stmt.executeQuery("SELECT field1,field2 FROM test");
//Process result set

}
catch(Exception e) {
e.printStackTrace();
}

ResultSetMetaData metaData = (ResultSetMetaData) rs.getMetaData();

// names of columns
Vector<String> columnNames = new Vector<String>();
int columnCount = metaData.getColumnCount();
for (int column = 1; column <= columnCount; column++) {
columnNames.add(metaData.getColumnName(column));
}

// data of the table
Vector<Vector<Object>> data = new Vector<Vector<Object>>();
while (rs.next()) {
Vector<Object> vector = new Vector<Object>();
for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
vector.add(rs.getObject(columnIndex));
}
data.add(vector);
}
myConn.close();
DefaultTableModel dtm = new DefaultTableModel(data, columnNames);
return dtm ;
}

public void changed(JTable table) {
DefaultTableModel dtm = (DefaultTableModel)table.getModel();
dtm.fireTableDataChanged();
table.repaint();
table.setModel(dtm);


}

public static void main(String[] args) {
JFrame frame = new JFrame();
frame.add(new Test());
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.pack();
frame.setSize(510,390);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setVisible(true);

}
}

最佳答案

在初始加载后,您不会在任何地方更新与您的 JTable 关联的 DefaultTableModel。您必须以编程方式更新 DefaultTableModel 才能将更新传播到 JTable。例如:

void changed(JTable table) 
{
DefaultTableModel dtm = (DefaultTableModel)table.getModel();
Vector data = dtm.getDataVector();
Vector data2 = (Vector)data.get(0);
data2.clear();
data2.add("changed data1");
data2.add("changed data2");
dtm.fireTableDataChanged();
table.repaint();
table.setModel(dtm);
}

上面的代码将反射(reflect)更改。您可能必须使用唯一键(例如在映射中)在默认表模型中维护行数据,然后检索该行数据(这是一个 vector 对象),然后使用更新的更改修改 vector 。这将反射(reflect)在 JTable 上

关于java - 将行插入数据库后 JTable 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31217655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com