有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

在这里,我创建了一个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);
    }
}

[1]: https://i.stack.imgur.com/G88Ae.png


共 (1) 个答案

  1. # 1 楼答案

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

        DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
        tableModel.setRowCount(0);
        tableModel.setColumnCount(0);
    

    清理模型后,再次填充它(在本例中,添加一些随机用户):

    model.addColumn("id");
    model.addColumn("Name");
    
    Vector<String> userName = new Vector<>();
    userName.add(user);
    model.addRow(userName);