行没有添加到java中的JTable

时间:2017-01-06 03:13:32

标签: java database jtable

我尝试在运行时在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);

1 个答案:

答案 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);
        }
    }
}