Java 插入行不更新GUI中的JTable
如标题中所述,除非重新启动程序,否则我无法使用新行更新JTable。当我重新启动时,新行就在那里,一切都是它应该的样子。我尝试过重新验证/重新喷涂面板和框架,我尝试过防火方法。我不知所措。提前谢谢 “添加”按钮的ActionListener(在adminGUI类中):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
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) {
}
}