我尝试在运行时在JTable
中添加行,数据来自数据库,但行没有添加到JTable
。我已尝试过stackoverflow的大量解决方案,但我没有取得任何成功。
这是我的代码:
DefaultTableModel model = new DefaultTableModel(new String[]{ "Invoice Number", "Consignee's Name", "Invoice Date", "Amount" }, 0);
void setLabel(String s1,String s2) {
JOptionPane.showMessageDialog(this, "You Choose Invoice List of Period "+s1+" to "+s2, "Success", JOptionPane.INFORMATION_MESSAGE);
try {
Class.forName("com.mysql.jdbc.Driver");
java.sql.Connection con = DriverManager.getConnection ("jdbc:mysql://localhost:3306/resetdb", "root", "");
java.sql.Statement stmt = con.createStatement();
ResultSet rs = null;
String SQL;
SQL="Select * from bill_info where invdt BETWEEN '"+s1+"' AND '"+s2+"'";
rs = (ResultSet) stmt.executeQuery(SQL);
if (rs.next()) {
rs.beforeFirst();
while(rs.next()) {
count++;
String d = rs.getString("invoice");
String e = rs.getString("Cname");
String f = rs.getString("invdt");
String g = rs.getString("Amount");
model.addRow(new Object[]{ d,e,f,g });
}
}
}
catch(Exception e) {
JOptionPane.showMessageDialog(this,e.getMessage());
}
}
从前一帧调用函数setLabel(String s1, String s2)
,我以String
格式传递2个日期作为参数。我的任务是打印所选期间内的所有发票数据。
为了检查,我又尝试了一件事。我在model.addRow(new Object[]{ d,e,f,g });
之前的代码中添加了以下行,以检查数据是否已成功检索并在输出中成功打印数据:
System.out.println(d);
System.out.println(e);
System.out.println(f);
System.out.println(g);
答案 0 :(得分:0)
是否从Swing Event Dispatching Thread调用setLabel()
?如果没有,这可能会导致问题,因为大多数Swing组件只能在EDT上更新。
如果从EDT调用setLabel()
,则还有另一个问题:连接到数据库并在EDT中执行长时间运行的任务,这可能会锁定您的UI。相反,您应该使用SwingWorker<>
来访问数据库。
Minimal Complete Verifiable Example:
public class TableTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(TableTest::new);
}
private final static String[] COLUMNS = { "x", "x^2", "x^3", "x^4" };
DefaultTableModel model = new DefaultTableModel(COLUMNS, 0);
TableTest() {
JFrame frame = new JFrame("Table Test");
frame.setSize(600, 300);
frame.setLayout(new BorderLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTable tbl = new JTable(model);
frame.add(new JScrollPane(tbl), BorderLayout.CENTER);
JPanel btns = new JPanel();
frame.add(btns, BorderLayout.PAGE_START);
btns.add(new JButton(fillTable));
frame.setVisible(true);
}
@SuppressWarnings("serial")
Action fillTable = new AbstractAction("Fill Table") {
@Override
public void actionPerformed(ActionEvent e) {
fillTable.setEnabled(false);
Query query = new Query();
query.execute();
}
};
class Query extends SwingWorker<Void, String[]> {
@Override
protected void process(List<String[]> chunks) {
for (String[] row : chunks) {
model.addRow(row);
}
}
@Override
protected Void doInBackground() throws Exception {
for (int i = 0; i < 10; i++) {
Thread.sleep(400); // Slow database retrieval :-)
String[] row = new String[4];
row[0] = Integer.toString(i);
row[1] = Integer.toString(i * i);
row[2] = Integer.toString(i * i * i);
row[3] = Integer.toString(i * i * i * i);
publish(row);
}
return null;
}
@Override
protected void done() {
fillTable.setEnabled(true);
}
}
}