Java 为什么在刷新jdbc swing表中的按钮后,数据会多次出现?

Java 为什么在刷新jdbc swing表中的按钮后,数据会多次出现?,java,mysql,swing,Java,Mysql,Swing,在这里,我创建了一个JTable,并用JScrollPane将其包围起来。我创建了一个更新和刷新按钮,以便可以刷新和更新数据集中的值。但问题在于,每当我单击刷新按钮时,它会多次显示数据。就像我在更新名称后设置了10个数据一样,当我刷新按钮时,它再次显示10个数据意味着总共10+10=20个相同类型的数据 package insertData; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.J

在这里,我创建了一个
JTable
,并用
JScrollPane
将其包围起来。我创建了一个更新和刷新按钮,以便可以刷新和更新数据集中的值。但问题在于,每当我单击刷新按钮时,它会多次显示数据。就像我在更新名称后设置了10个数据一样,当我刷新按钮时,它再次显示10个数据意味着总共10+10=20个相同类型的数据

package insertData;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

import com.mysql.cj.xdevapi.Statement;
import com.sun.jdi.connect.spi.Connection;
//import com.sun.tools.sjavac.pubapi.PubApi;

import java.awt.Color;
import javax.swing.JScrollPane;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.awt.event.ActionEvent;
import javax.swing.JSplitPane;

public class Table_formate {
    private JFrame frame;
    private JTextField nametextField;
    private JTextField idtextField;
    private JTextField textFieldname;
    private JTextField textFieldid;
    private JTable table;
    //Connection connection;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Table_formate window = new Table_formate();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public Table_formate() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 539);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
        
        nametextField = new JTextField();
        nametextField.setBounds(140, 11, 152, 37);
        frame.getContentPane().add(nametextField);
        nametextField.setColumns(10);
        
        idtextField = new JTextField();
        idtextField.setColumns(10);
        idtextField.setBounds(140, 68, 152, 37);
        frame.getContentPane().add(idtextField);
        
        JButton btnNewButton = new JButton("Submit");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {
                    Class.forName("com.mysql.jdbc.Driver");//load driver    
                    java.sql.Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/student","root","root");    //Establish connection
                    System.out.println("sucess");
                    
                    String drop="insert into student values(?,?) ";
                    java.sql.PreparedStatement ps=((java.sql.Connection) connection).prepareStatement(drop);
                    //System.out.println(ps);
                    ps.setInt(1, Integer.parseInt(idtextField.getText()));
                    ps.setString(2, nametextField.getText());
                    
                    System.out.println("id="+idtextField.getText()+"     "+"name="+nametextField.getText());
                    
                    ps.executeUpdate();
                    ps.close();
                    
                } catch (SQLException e1) {
                    e1.printStackTrace();
                } catch (ClassNotFoundException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
        });
        btnNewButton.setBounds(324, 36, 89, 46);
        frame.getContentPane().add(btnNewButton);
        
        JLabel lblNewLabel = new JLabel("Name:");
        lblNewLabel.setBounds(27, 11, 76, 37);
        frame.getContentPane().add(lblNewLabel);
        
        JLabel lblNewLabel_1 = new JLabel("Id:");
        lblNewLabel_1.setBounds(27, 68, 76, 37);
        frame.getContentPane().add(lblNewLabel_1);
        
        JButton Refreshbtn = new JButton("Refresh");
        Refreshbtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {
                    DefaultTableModel tableModel=(DefaultTableModel) table.getModel();
                    Class.forName("com.mysql.jdbc.Driver");
                    java.sql.Connection  connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/student","root","root");
                    java.sql.Statement stmt=((java.sql.Connection) connection).createStatement();
                    System.out.println("connection sucessful");
                    ResultSet rs= ((java.sql.Statement) stmt).executeQuery("select * from student order by id");
                    //PreparedStatement ps=connection.prepareStatement("select * from student order by id");
                    while ( rs.next()) {
                        String name=rs.getString("name");
                        int id=rs.getInt("id");
                        System.out.println(id+ "name="+name);

                        tableModel.addRow(new Object[] {id,name});
                    } 
                    stmt.close();
                    rs.close();
                    
                } catch (ClassNotFoundException e1) {
                    e1.printStackTrace();
                } catch (SQLException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                } 
            }
        });
        Refreshbtn.setBounds(122, 139, 89, 30);
        frame.getContentPane().add(Refreshbtn);
        
        JLabel lblNewLabel_2 = new JLabel("Name:");
        lblNewLabel_2.setBounds(27, 395, 76, 37);
        frame.getContentPane().add(lblNewLabel_2);
        
        JLabel lblNewLabel_1_1 = new JLabel("Id:");
        lblNewLabel_1_1.setBounds(27, 452, 76, 37);
        frame.getContentPane().add(lblNewLabel_1_1);
        
        textFieldname = new JTextField();
        textFieldname.setColumns(10);
        textFieldname.setBounds(140, 395, 152, 37);
        frame.getContentPane().add(textFieldname);
        
        textFieldid = new JTextField();
        textFieldid.setColumns(10);
        textFieldid.setBounds(140, 452, 152, 37);
        frame.getContentPane().add(textFieldid);
        
        JButton btnUpdat = new JButton("update");
        btnUpdat.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String drop="update student set name=? where id=?";
                try {
                    Class.forName("com.mysql.jdbc.Driver");
                    java.sql.Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/student","root","root");
                    PreparedStatement ps=((java.sql.Connection) connection).prepareStatement(drop);
                    
                    ps.setString(1, textFieldname.getText());
                    ps.setInt(2, Integer.parseInt(textFieldid.getText()));
                    
                    ps.executeUpdate();
                    
                   System.out.println("Record updated");
                    ps.close();
                    
                    Refreshbtn.doClick();
                    
                } catch (ClassNotFoundException | SQLException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
        });
        btnUpdat.setBounds(324, 420, 89, 46);
        frame.getContentPane().add(btnUpdat);
        
        JButton btnEdit = new JButton("Edit");
        btnEdit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                DefaultTableModel tableModel=(DefaultTableModel) table.getModel();
                tableModel.fireTableDataChanged();
                int row=table.getSelectedRow();
                
                String name=(String) tableModel.getValueAt(row, 1);
                String id=(String) tableModel.getValueAt(row, 0).toString();
                textFieldid.setText(id);
                textFieldname.setText(name);
            }
        });
        btnEdit.setBounds(231, 139, 89, 30);
        frame.getContentPane().add(btnEdit);
        
        table = new JTable();
        table.setModel(new DefaultTableModel(
            new Object[][] {
            },
            new String[] {
                "id", "name"
            }
        ));
        table.setBounds(10, 203, 414, 167);
        frame.getContentPane().add(table);
    }
}

如@Abra所述,在刷新时和添加新数据之前,只需清除
DefaultTableModel的内容,如下所示:

    DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
    tableModel.setRowCount(0);
    tableModel.setColumnCount(0);
清理模型后,再次填充它(在本例中,添加一些随机用户):

model.addColumn(“id”);
model.addColumn(“名称”);
向量用户名=新向量();
用户名。添加(用户);
model.addRow(用户名);

从数据库检索行时,您没有清除表模型。您还在Swing组件上使用绝对定位,这将导致将来出现问题。使用Swing。您好,Dilbert,请您清楚地告诉我,因为我没有得到问题及其解决方案……方法
addRow
(在类
DefaultTableModel
)将另一行添加到
JTable
。如果将同一行添加两次,它将在
JTable
中出现两次。当用户单击刷新按钮时,您正在将数据库中的所有数据添加到
DefaultTableModel
中,但是
DefaultTableModel
已包含所有数据库数据,因此在添加
ResultSet
中的行之前,您需要先从
DefaultTableModel
中删除所有数据。非常感谢,现在我发现了这个问题并能够解决非常感谢,现在我知道问题并能解决了。
model.addColumn("id");
model.addColumn("Name");

Vector<String> userName = new Vector<>();
userName.add(user);
model.addRow(userName);