gpt4 book ai didi

java - INSERT 行不会更新 GUI 中的 JTable

转载 作者:行者123 更新时间:2023-11-30 04:01:54 24 4
gpt4 key购买 nike

如标题中所述,除非重新启动程序,否则我无法使用新行更新我的 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);
}

向数据库表添加一行的字符串方法(在主类中):

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.resultSetToTableModel 详细信息:

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;
}
}

}

最佳答案

"I cannot get my JTable to update with a new row unless I restart the program."

我认为您所期望的是,当数据库表更新时,您的 JTable 也应该更新。事实并非如此。您需要更新TableModelJTable将自动更新

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

因此,当您将数据添加到数据库时,您还需要像这样更新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,因此它将适合传递给 Object[]添加行。您传递给它的 int 将自动装箱为 Integer

<小时/>

旁注

  • 不要在 catch block 中放置任何内容,从而吞掉异常。添加一些有意义的内容来通知您可能发生的任何异常,例如

     catch(Exception ex) {
    ex.printStackTrace();
    }
  • 您还应该关闭您的ConnectionStatementResultSet

  • 您应该使用PreparedStatement而不是 Statement,以避免 SQL 注入(inject)。

关于java - INSERT 行不会更新 GUI 中的 JTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21776140/

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