从 JLIST 中选择一个项目并使用来自该选定 id 的所有 db 信息更新一个表单

Posted

技术标签:

【中文标题】从 JLIST 中选择一个项目并使用来自该选定 id 的所有 db 信息更新一个表单【英文标题】:Select a item from a JLIST and update a form with all db info from that selected id 【发布时间】:2014-04-15 12:49:12 【问题描述】:

我的问题类似于this question,但对我不起作用=(

我有一个名为 clients 的数据库,其中包含 ID、姓名、电话和电子邮件。当我注册客户时,他的姓名和 ID 会显示在 Jlist 上。现在我想在 Jlist 中单击名称并“搜索”该客户的所有数据(ID、姓名、电话和电子邮件)。 我已经有 textField´s 来链接数据,但不工作...

我做了什么:

DefaultListModel model = new DefaultListModel();
client_listClientes.setModel(model);

try 

   String host = "jdbc:derby://localhost:1527/ANAIA_DB";
   String uName = "*****";    
   String uPass = "*****";

   con = DriverManager.getConnection(host, uName, uPass);
   stmt = con.createStatement();

   String sql = "SELECT * FROM APP.CLIENTS";

   int id_col = rs.getInt("clientID"); // I need to make this work.. when i select a value, it gives me the id for that client

   ResultSet RS = stmt.executeQuery("SELECT * FROM APP.CLIENTS WHERE CLIENTID='"+id_col+"'");
   rs = stmt.executeQuery(sql);

   while (RS.next())

      String name = rs.getString("clientName");
      client_textName.setText(name);
      String phone = rs.getString("clientPhone");
      client_textPhone.setText(phone);
      String email = rs.getString("clientMail");
      client_textMail.setText(email);


   

catch (SQLException err) 
JOptionPane.showMessageDialog(main.this, err.getMessage());

我读到我必须使用监听器,但我尝试了另一个问题的示例但没有工作 =/

【问题讨论】:

【参考方案1】:

只需一次将所有数据加载到Client 对象中,而不是每次都尝试返回并访问数据库。

class Client 
    int id;
    String name;
    String phone;
    String email;

    // getter and setters

    @Override
    public String toString() 
        return id + " : " + name;
    

然后您可以将所有数据加载到客户端对象中,然后将它们添加到模型中

 ResultSet RS = stmt.executeQuery("SELECT * FROM APP.CLIENTS");
 ...
 while (RS.next())

     Client client = new Client();
     client.setId(rs.getInt("id");
     client.setName(rs.getString("clientName"));
     client.setPhone(rs.getString("clientPhone"));
     client.setEmail(rs.getString("clientMail");

     model.addElement(client);
 

然后我们点击 JList,只需提取选中的 Client 对象并使用 getters 设置文本字段

 client_listClientes.addListSelectionListener(new ListSelectionListener()
     public void valueChanged(ListSelectionEvent e) 
         if (!e.getValueIsAdjusting()) 
              JList list = (JList)e.getSource();
              Client client = (Client)list.getSelectedValue();
              textfield.setText(client.getEmail());
         
     
 );

【讨论】:

Hummm 刚回家试了一下。由于我已经在使用“ResultSet RS”,所以它给了我一个错误“ResultSet not open。不允许下一步操作。验证 autocomit 是否关闭” 在您当前的选择中,您只选择了一行。我只是告诉您选择所有行并将它们添加到客户端对象。如果你需要重新格式化你的代码,那就去做吧。我不是要你使用两个结果集。

以上是关于从 JLIST 中选择一个项目并使用来自该选定 id 的所有 db 信息更新一个表单的主要内容,如果未能解决你的问题,请参考以下文章

从 JList 中删除所选项目

JList - 单击已选择的项目时取消选择

JList不显示选定的值

禁用 JList 中的项目

刷新 JFrame 中的 JList

使用 JList