JTable 不会在将数据插入 mysql 时重新绘制/刷新
Posted
技术标签:
【中文标题】JTable 不会在将数据插入 mysql 时重新绘制/刷新【英文标题】:JTable won't repaint/refresh on data insert into mysql 【发布时间】:2014-02-26 13:45:41 【问题描述】:我不确定我做错了什么,但我从 mysql 数据库获取数据并使用 DefaultTableModel 填充 JTable。然后我在屏幕上显示它。将数据从文本框添加到数据库后,JTable 不会刷新。我检查了数据库并插入了数据。我已经尝试在事件侦听器中使用 table.repaint()
或 dTableModel.fireTableDataChanged()
添加按钮,但仍然没有。代码如下:
public class DbTable
private JLabel lFirstName, lLastName, lState, lBirthDate;
private JTextField fFirstName, tLastName, tState, tBirthDate;
private JButton btnAdd;
private Object[][] databaseResults;
private Object[] columns = "Col 1", "Col 2", "Col 3", "Col 4",
"Col 5", "ЈCol 6", "Col 7" ;
private ResultSet rows;
private ResultSet rowsCb;
private JComboBox combobox;
private DefaultTableModel dTableModel = new DefaultTableModel(
databaseResults, columns)
public Class getColumnClass(int column)
Class returnValue;
if ((column >= 0) && (column < getColumnCount()))
returnValue = getValueAt(0, column).getClass();
else
returnValue = Object.class;
return returnValue;
;
private JTable table = new JTable(dTableModel);
Connection conn = null;
public static void main(String[] args)
DbTable dbTable = new DbTable();
dbTable.getTable();
public void getTable()
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost/database", "root", "");
Statement sqlState = conn.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
String selectStuff = "SELECT `invoice`.`id` , `client`, `date`, `project`, `amount`,`unitPrice`, `total`"
+ "FROM `invoice` , `clients`"
+ "WHERE `invoice`.`clientID` = `clients`.`id`"
+ "ORDER BY `invoice`.`id` ASC ";
rows = sqlState.executeQuery(selectStuff);
Object[] tempRow;
while (rows.next())
tempRow = new Object[] rows.getInt(1), rows.getString(2),
rows.getString(3), rows.getString(4), rows.getInt(5),
rows.getInt(6), rows.getDouble(7) ;
dTableModel.addRow(tempRow);
catch (SQLException e)
e.getMessage();
catch (ClassNotFoundException e)
e.getMessage();
table.setFont(new Font("Tahoma", Font.PLAIN, 14));
table.setAutoCreateRowSorter(true);
JScrollPane scrollPane = new JScrollPane(table);
// frame.add(combobox, BorderLayout.NORTH);
frame.add(scrollPane, BorderLayout.NORTH);
// Define values for my labels
lFirstName = new JLabel("Klijent ID: ");
lLastName = new JLabel("Datum: ");
lState = new JLabel("Projekat: ");
lBirthDate = new JLabel("Ukupno"); // Define the size of text fields
fFirstName = new JTextField(10);
tLastName = new JTextField(10);
tBirthDate = new JTextField(10);
tState = new JTextField(10);
btnAdd = new JButton("Add");
btnAdd.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent arg0)
String sDatum = "", sProjekat = "";
int sKlijenId;
double sUkupno = 0.00;
sKlijenId = Integer.parseInt(fFirstName.getText());
sDatum = tLastName.getText();
sProjekat = tState.getText();
sUkupno = Double.parseDouble(tBirthDate.getText());
try
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost/sjajplusz", "root", "");
Statement sqlState = conn.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
String selectStuff = "SELECT * FROM invoice";
rows = sqlState.executeQuery(selectStuff);
rows.moveToInsertRow();
rows.updateInt("clientID", sKlijenId);
rows.updateString("date", sDatum);
rows.updateString("project", sProjekat);
rows.updateDouble("total", sUkupno);
rows.insertRow();
rows.updateRow();
catch (SQLException e1)
e1.getMessage();
catch (ClassNotFoundException e)
// TODO Auto-generated catch block
e.printStackTrace();
int invoiceId = 0;
try
rows.last();
invoiceId = rows.getInt(1);
catch (SQLException e)
e.getMessage();
// Object[] invoice = invoiceId, sKlijenId, sDatum, sProjekat, "", "", sUkupno;
//
// dTableModel.addRow(invoice);
dTableModel.fireTableDataChanged();
);
JPanel inputPanel = new JPanel(); // Put components in the panel
inputPanel.add(lFirstName);
inputPanel.add(fFirstName);
inputPanel.add(lLastName);
inputPanel.add(tLastName);
inputPanel.add(lState);
inputPanel.add(tState);
inputPanel.add(lBirthDate);
inputPanel.add(tBirthDate);
inputPanel.add(btnAdd);
frame.add(inputPanel, BorderLayout.SOUTH);
// frame.add(scrollPane, BorderLayout.CENTER);
frame.setSize(500, 400);
frame.setVisible(true);
try
conn.close();
catch (SQLException e1)
// TODO Auto-generated catch block
e1.printStackTrace();
基本上这是这个youtube系列的后续Java JTable 38
【问题讨论】:
【参考方案1】:您没有从数据库中重新加载数据。将其添加到数据库后,您必须重新加载数据,刷新您的DefaultTableModel
,然后调用fireTableDataChanged()
。您最初只是在 getTable()
方法中执行此操作。您必须提取加载数据的代码并在您的操作侦听器中调用它。
顺便说一句。即使您插入数据的方式有点复杂,您的代码也没有很好地组织。我建议学习一些关于此的基本教程。
【讨论】:
代码只是 yt 教程系列的后续。如何刷新DefaultTableModel
?
DefaultTableModel
提供了 setDataVector()
方法,您可以在其中传递新数据。
好的,所以我让它像这样工作:dTableModel.setNumRows(0); table.setModel(dTableModel); table.setModel(getData());
和 getData()
是从数据库中获取新数据的单独方法。有没有更好的方法来做到这一点?
如果有效,您的问题似乎已得到解答。可能有更好的方法,但就目前而言,了解您编写的每一行代码以了解 JTable 和 TableModel 背后的概念非常重要。
-1, ` 刷新你的 DefaultTableModel 然后调用 fireTableDataChanged()。` - 调用任何 fireXXX() 方法应该由 TableModel 完成,而不是应用程序代码。 DefaultTableModel 确实调用了适当的方法。以上是关于JTable 不会在将数据插入 mysql 时重新绘制/刷新的主要内容,如果未能解决你的问题,请参考以下文章
Jetbrains Datagrip 2017.1.3,在将数据转储到 sql 插入文件时强制导出列
iOS - 如何在将单元格动态插入 UICollectionView 之前正确重新加载单元格
将 SQLite 表数据显示到列表视图中,就在将数据插入同一 Activity 上的表之后,无需关闭 Activity 并重新打开