Java 插入行不更新GUI中的JTable

Java 插入行不更新GUI中的JTable,java,swing,ms-access,jtable,insert-update,Java,Swing,Ms Access,Jtable,Insert Update,如标题中所述,除非重新启动程序,否则我无法使用新行更新JTable。当我重新启动时,新行就在那里,一切都是它应该的样子。我尝试过重新验证/重新喷涂面板和框架,我尝试过防火方法。我不知所措。提前谢谢 “添加”按钮的ActionListener(在adminGUI类中): if(source.equals(add2)){ String c = itb.getText(); int a = main.getResults(); boolean ma

如标题中所述,除非重新启动程序,否则我无法使用新行更新JTable。当我重新启动时,新行就在那里,一切都是它应该的样子。我尝试过重新验证/重新喷涂面板和框架,我尝试过防火方法。我不知所措。提前谢谢

“添加”按钮的ActionListener(在adminGUI类中):

if(source.equals(add2)){
         String c = itb.getText();
         int a = main.getResults();
         boolean matches = Pattern.matches("[A-Z][a-z]+", c);

         if(matches == true){ 
         main.addGenre(a, c); 
       }
将行添加到数据库表的String方法(在主类中):

public static void addGenre(int a, String b){
    int rowsAdded;
    try {

     Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
     Connection connect =DriverManager.getConnection("jdbc:odbc:MovieDB");
     Statement stmt = connect.createStatement();
     String query = "INSERT INTO Genres (genre_id, genre_name)" + "VALUES(" + a + ", '" + b + "')";
     rowsAdded = stmt.executeUpdate(query);
    }catch(Exception exc){}
 }
方法(也在主类中)以递增自动递增键列:

public static int getResults(){
      int a = 0;
      ResultSet ints = main.getResults("Select genre_id from Genres");
    try {
        while(ints.next()){
            int d = ints.getInt("genre_id");
            if(d>a){
                a = d;    
            }
            a++;
        }  
    } catch (SQLException ex) {
        Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
    }

      return a;
  }
JTable详细信息:

ResultSet rs1 = main.getResults("Select * from Genres"); 
JTable tab1 = new JTable(DbUtils.resultSetToTableModel(rs1));
DbUtils.ResultSetTableModel详细信息:

public class DbUtils {
public static TableModel resultSetToTableModel(ResultSet rs) {
    try {
        ResultSetMetaData metaData = rs.getMetaData();
        int numberOfColumns = metaData.getColumnCount();
        Vector columnNames = new Vector();

        // Get the column names
        for (int column = 0; column < numberOfColumns; column++) {
            columnNames.addElement(metaData.getColumnLabel(column + 1));
        }

        // Get all rows.
        Vector rows = new Vector();

        while (rs.next()) {
            Vector newRow = new Vector();

            for (int i = 1; i <= numberOfColumns; i++) {
                newRow.addElement(rs.getObject(i));
            }

            rows.addElement(newRow);
        }

        return new DefaultTableModel(rows, columnNames);
    } catch (Exception e) {
        e.printStackTrace();

        return null;
    }
}
公共类DbUtils{
公共静态表模型ResultSetTableModel(ResultSet rs){
试一试{
ResultSetMetaData元数据=rs.getMetaData();
int numberOfColumns=metaData.getColumnCount();
向量列名称=新向量();
//获取列名
for(int column=0;column
我认为您期望的是,当数据库表更新时,您的
JTable
也应该更新。它实际上不是这样工作的。您需要更新
TableModel
,并且
JTable
将自动更新

由于
resultsetTableModel
返回一个
DefuaultTableModel
,因此可以使用
DefaultTableModel
中的两种方法之一:

  • -将行添加到模型的末尾。除非指定了rowData,否则新行将包含空值。将生成正在添加的行的通知

  • -将行添加到模型的末尾。除非指定了rowData,否则新行将包含空值。将生成正在添加的行的通知

因此,当您将数据添加到数据库时,您还需要像这样更新
DefaultTableModel

public static void addGenre(Integer a, String b){
    ...
    rowsAdded = stmt.executeUpdate(query);
    if (rowsAdded > 0) {
        DefaultTableModel model = (DefaultTableModel)tab1.getModel();
        model.addRow( new Object[] { a, b });
    }
}
还注意到我将方法签名改为
Integer
而不是
int
,因此它将与传递给
addRow
对象[]
相匹配。传递给它的
int
将自动装箱到
Integer


旁注

  • 不要通过在
    catch
    块中不放入任何内容来吞咽异常。放入一些有意义的内容,以通知您可能发生的任何异常,例如

     catch(Exception ex) {
         ex.printStackTrace();
     }
    
  • 您还应该
    关闭
    您的
    连接
    s、
    语句
    s和
    结果集
    s

  • 您应该使用而不是
    语句
    ,以避免SQL注入

private void resetListData()抛出ClassNotFoundException、SQLException
{
连接cne=null;
试一试{
Class.forName(“org.sqlite.JDBC”);
cne=DriverManager.getConnection(“jdbc:sqlite:table.sqlite”);
cne.setAutoCommit(假);
PreparedStatement psd=(PreparedStatement)cne.prepareStatement(“从流派中选择*);
psd.execute();
ResultSet r=psd.getResultSet();
ResultSetMetaData rsmd=r.getMetaData();
int count=rsmd.getColumnCount();
字符串[]元=新字符串[计数];
for(int i=0;i对于(int i=1;我请发布与resultSetToTableModel()相关的代码)方法。已经在中添加了。谢谢在您的代码中您到底在哪里尝试添加行?我没有看到在AddGene方法中,一行被添加到数据库中。tab1是保存类型表中数据的表。我不知道如何更新JTable以显示添加的内容。它显示在数据库中,但不刷新JTable un直到我完全重新启动程序,而不是返回新的DefaultTableModel(行、列名称);返回DefaultTableModel的引用,然后使用tab1.setModel(RefofDefaultTableModel);OP的
resultSetToTableModel
方法没有问题。问题是动态地向表中添加更多的行。@peeskillet:是的,我知道,但它在他进入记录时动态地添加行。。所以这不是向下投票的原因。。我提供了他想要做的。。并且没有错误。。你可以检查并运行我的code..您的代码可能有效,但不适用于OP问题。如果您仔细阅读问题、注释和代码,您将看到
JTable
正确显示初始数据。这就是您的方法所做的一切。OPs的问题是,他们假设向数据库添加数据将自动更新
JTable
。因此,OP所描述的问题是
addgreen
方法。即使您的代码在将数据添加到数据库后调用时确实更新了表,但这一切都是非常不必要的,因为它们所需要的都是添加到
addgreen
@peeskillet中的行中。我不这么认为。让它在OP上吧,不管他想要什么d?我的答案还是你的答案?看看你在做什么,然后想想。添加数据后,需要在
addgreen
方法内部调用此方法。1)该方法已与数据库建立了连接、语句,并且你的方法将创建另一个连接2)您将创建一个全新的
DefaultTableModel
,并从当前
DefaultTableMod中存在的;ready数据库中添加数据
private void resetListData() throws ClassNotFoundException, SQLException 
{
    Connection cne = null;
    try {

        Class.forName("org.sqlite.JDBC");
        cne = DriverManager.getConnection("jdbc:sqlite:table.sqlite");
        cne.setAutoCommit(false);
        PreparedStatement psd = (PreparedStatement) cne.prepareStatement("Select * from Genres");                
        psd.execute();
        ResultSet r = psd.getResultSet();
        ResultSetMetaData rsmd = r.getMetaData();
        int count = rsmd.getColumnCount();
        String[] meta = new String[count];
        for (int i = 0; i < count; i++) 
        {
            String name = rsmd.getColumnName(i + 1);
            meta[i] = name;
            //System.out.println(name);
        }
        model = new DefaultTableModel(new Object[][]{}, new String[]{"name", "address"});
        jTable1.setModel(model);
        while (r.next()) 
        {
            Object[] row = new Object[count];
            for (int i = 1; i <= count; ++i) 
            {
                row[i - 1] = r.getString(i);  // Or even rs.getObject() 
            }
            model.addRow(row);
        }
        cne.close();
    } catch (ClassNotFoundException | SQLException e) {
    }
}