java - 如何显示从 JTable 连接到 MS Access 数据库到文本字段的单击行

标签 java swing ms-access

我有一个程序,可以将 MS Access 数据库的行和列显示到我的 JTable 中,如果单击该 JTable 中的一个单元格,所有数据都将显示到其相应的 JTextField 中。这是我的代码。

    public void reloadData() throws ClassNotFoundException, SQLException 
    {        

            columnNames.clear();
            data.clear();

            String DBPAD = "sourceFolder/employeeTable1.mdb";
            String DB = "jdbc:ucanaccess://" + DBPAD;   

            con1x = DriverManager.getConnection(DB);
            st1x = con1x.createStatement();
            rs1x = st1x.executeQuery("Select * FROM employeeTable1");
            ResultSetMetaData rsmd = rs1x.getMetaData();
            int column = rsmd.getColumnCount();                 

            columnNames.addElement("Employee Name");              
            columnNames.addElement("Employee Address");            
            columnNames.addElement("Employee Marital Status");
            columnNames.addElement("Employee Date of Membership");
            columnNames.addElement("Employee Blood Type");
            columnNames.addElement("Employment Status");                
            columnNames.addElement("Employee Gender");
            columnNames.addElement("Employee Date Of Birth");
            columnNames.addElement("Employee Age");
            columnNames.addElement("Beginning Capital");
            columnNames.addElement("Gross Salary");
            columnNames.addElement("Salary Deductions");
            columnNames.addElement("Net Salary");

            while(rs1x.next()) 
            {
                Vector<Object> row = new Vector<Object>(column);
                for(int i=1; i<=column; i++) 
                {                   
                     row.addElement(rs1x.getObject(i));
                }
                data.addElement(row);               
            }   


            try
            {
                mainTableJTableCoop.getSelectionModel().addListSelectionListener(new ListSelectionListener()
                {
                   public void valueChanged(ListSelectionEvent event) 
                   {    
                      String employeeName = (mainTableJTableCoop.getValueAt(mainTableJTableCoop.getSelectedRow(), 0).toString());
                      endrollNameFields.setText(employeeName);                  

                      String employeeAddress = (mainTableJTableCoop.getValueAt(mainTableJTableCoop.getSelectedRow(), 1).toString());
                      endrollAddressFields.setText(employeeAddress);

                      String employeeMaritalSatatus = (mainTableJTableCoop.getValueAt(mainTableJTableCoop.getSelectedRow(), 2).toString());
                      maritalstatusFields.setText(employeeMaritalSatatus);

                      String employeeDateOfMembership = (mainTableJTableCoop.getValueAt(mainTableJTableCoop.getSelectedRow(), 3).toString());
                      dateOfMembershipFields.setText(employeeDateOfMembership);

                      String employeeBloodType = (mainTableJTableCoop.getValueAt(mainTableJTableCoop.getSelectedRow(), 4).toString());
                      bloodTypeFields.setText(employeeBloodType);

                      String employeeEmploymentStatus = (mainTableJTableCoop.getValueAt(mainTableJTableCoop.getSelectedRow(), 5).toString());
                      endrollEmployeestatusFields.setText(employeeEmploymentStatus);

                      String employeeGender = (mainTableJTableCoop.getValueAt(mainTableJTableCoop.getSelectedRow(), 6).toString());
                      genderFields.setText(employeeGender);

                      String dateOfBirth = (mainTableJTableCoop.getValueAt(mainTableJTableCoop.getSelectedRow(), 7).toString());
                      birthDateFields.setText(dateOfBirth); 

                      String employeeAge = (mainTableJTableCoop.getValueAt(mainTableJTableCoop.getSelectedRow(), 8).toString());
                      ageFields.setText(employeeAge);   

                      String beginningCapital = (mainTableJTableCoop.getValueAt(mainTableJTableCoop.getSelectedRow(), 9).toString());
                      beginningCapitalFields.setText(beginningCapital);

                      String grossSalary = (mainTableJTableCoop.getValueAt(mainTableJTableCoop.getSelectedRow(), 10).toString());
                      grossSalaryFields.setText(grossSalary);

                      String deductions = (mainTableJTableCoop.getValueAt(mainTableJTableCoop.getSelectedRow(), 11).toString());
                      salaryDeductionFields.setText(deductions);

                      String netSalary = (mainTableJTableCoop.getValueAt(mainTableJTableCoop.getSelectedRow(), 12).toString());
                      netSalaryFields.setText(netSalary);                
                   }
                });              
            }
            catch(Exception e)
            {
                JOptionPane.showMessageDialog(null, e);
            }


    }

我的代码看起来不错,但每次我单击连接到我的 MS Access 数据库的 JTable 中的一行时,我的 JTextFields 中显示的信息始终是第一行的数据,即使我单击第二行、第三行也是如此。有什么建议可以实现我想要的输出吗?

最佳答案

如果没有可运行的示例,很难 100% 确定,我的第一个想法是,当调用 reloadData 时,您不应该向 JTable 添加另一个 ListSelectionListener。每次您调用此方法时,这都会累积添加另一个监听器,这可能会产生一些有趣的副作用,并可能降低您的程序的性能。

此外,ListSelectionListener 可能会收到两次有关选择更改的通知,一次是在取消选择选择(当前选择的内容)时,一次是在发生新选择时。

您应该检查 ListSelectionEventgetValueIsAdjusting 的状态,以确定是否可以传递另一个事件

public void valueChanged(ListSelectionEvent event) 
{   
    if (!event.getValueIsAdjusting()) {
        int selectedRow = mainTableJTableCoop.getSelectedRow();

参见How to Write a List Selection Listener了解更多详情。

考虑提供runnable example这说明了你的问题。这不是代码转储,而是您正在执行的操作的示例,它突出显示了您遇到的问题。这将减少困惑并获得更好的响应

关于java - 如何显示从 JTable 连接到 MS Access 数据库到文本字段的单击行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30136699/

相关文章:

java - onStartLoading() 和forceLoad() 是在哪里调用和实现的?

java - 在 JTable 中自动添加一些文本

java - 什么是 Swing-相当于 HTML <optgroup>

java - 使用 ODBC 和 MS Access 时出现主键冲突错误代码

c# - 排序 Access 数据(错误格式的日期时间)

java - JSoup 与祖先子运算符一起执行选择的问题

java - 为什么sqlite返回异常?

java - JSTL:无法实现标签 <c:forEach> 的类

java - 如何制作一个包含多个组件的 JTable?

regex - 7 位数字的正则表达式,后跟可选的 3 个字母