Java GUI JTable 'refreshing'

Java GUI JTable 'refreshing'

我正在制作一个 GUI,它包含一个 JPanel,在 JPanel 中有一个 JTable,我想做的是:当我单击一个按钮时,它们都会出现(因为我使用的是 CardLayout) .代码:

 private void teGjithaButtonActionPerformed(java.awt.event.ActionEvent evt) {                                               
try {
    parentPanel.setVisible(true);
    parentPanel.removeAll();
    parentPanel.add(tgjPanel);
    parentPanel.repaint();
    parentPanel.revalidate();
    listAllCurtains();
} catch (SQLException ex) {
    Logger.getLogger(MainBrillant.class.getName()).log(Level.SEVERE, null, ex);
}

以及 listAllCurtains() 的代码:

public void listAllCurtains() throws SQLException {
    DefaultTableModel deftm = (DefaultTableModel) allTable.getModel();

    if (deftm.getRowCount() != 0) {
        deftm.setRowCount(0);
    }

    stm = (Statement) conn.createStatement();
    ResultSet rs = stm.executeQuery("select * from customerregister.curtain inner join curtainrel on curtain.code = curtainrel.curtainCode;");
    while (rs.next()) {
        String shifra = rs.getString("code");
        String ngjyra = rs.getString("color");
        String emri = rs.getString("name");
        double cmimi = rs.getDouble("price");
        double sasia = rs.getDouble("amount");
        allCurtains.add(new Curtain(shifra, ngjyra, emri, cmimi, sasia));
    }

    Object[] row = new Object[5];


    for (int i = 0; i < allCurtains.size(); i++) {
        row[0] = allCurtains.get(i).getShifra();
        row[1] = allCurtains.get(i).getEmri();
        row[2] = allCurtains.get(i).getNgjyra();
        row[3] = allCurtains.get(i).getCmimi();
        row[4] = allCurtains.get(i).getSasia();
        deftm.addRow(row);
    }

}

问题是当我重新点击按钮时,尽管有这部分代码可以确保数据不重复:

if (deftm.getRowCount() != 0) {
    deftm.setRowCount(0);
}

每次单击按钮时,它仍会继续将相同的数据插入 table。我不明白为什么会这样,非常感谢你的帮助。

您的问题可能是由于这个变量造成的:allCurtains。您没有先清除它,然后继续添加它,因此所有旧数据仍由它保留。

在你的方法开始时,清除这个集合,也许通过 allCurtains.clear();

public void listAllCurtains() throws SQLException {
    DefaultTableModel deftm = (DefaultTableModel) allTable.getModel();

    if (deftm.getRowCount() != 0) {
        deftm.setRowCount(0);
    }
    allCurtains.clear(); // ***** add this *****

    // ..... more code

其他问题:您声明您正在使用 CardLayout,但 CardLayout 并不是这样使用的。