我想不断更新我的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/