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

标签 java mysql swing

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

相关文章:

java - 从 Java Swing 更新 GoogleMap 静态图像?

java - JPA hibernate 。在一次调用中将具有外键引用的父实体和子实体持久化到父实体

java - 如何设置我的图形以便用户可以更改大小并保持比例?

java - 如何确定hashcode值?

javascript - 将名称发布到 php MYSQL 数据库

java - Jtable java.lang.NullPointerException

Java GUI 读取具有上述路径的文件

java - 是否可以在 MigLayout 中指定深度?

sql - 带条件搜索字符串

php - 对多对多表进行分组的 Mysql 条件