带有actionperformed actionlistener的文本字段

时间:2012-11-01 13:20:53

标签: java swing jdbc jlabel jtextfield

我有一个jTextField和一个jLabel。我想在用户完成输入后自动从数据库中获取数据到我的标签。

subcode_txt.addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            Object obj=e.getSource();
            if(obj==subcode_txt){
            jst=subcode_txt.getText();
            try{

            rs=st.executeQuery("Select * from facultydtls where sub_code like '"+jst+"'");
            rs.next();
            faculty_lab.setText(rs.getString("f_name"));
            sem_lab.setText(rs.getString("sem"));
            subject_lab.setText(rs.getString("sub"));
            department_lab.setText(rs.getString("dept"));

            rs.close();

        }
        catch(Exception ewt){
            JOptionPane.showMessageDialog(null,"Invalid Subject Code");
        }
            }
        }
    });

2 个答案:

答案 0 :(得分:2)

  1. 如果您想对用户输入做出反应,DocumentListener是一种比KeyListener更好的方法
  2. 您可以选择ActionListener,当用户点击 ENTER
  3. 时会触发
  4. 您不应对Event Dispatch Thread执行数据库查询。请改用工作线程。有关详细信息,请参阅Concurrency in Swing
  5. close语句应放在finally
  6. 话虽如此,你到底在问什么?

答案 1 :(得分:2)

使用DocumentListener是在Swing中处理JTextComponents文本事件的首选方法。

数据库查询需要大量资源,应该在EDT之外完成,以防止UI“冻结”。请参阅此example中的SwingWorker

请注意,为每个DocumentEvent加载数据可能会向数据库发送大量不必要的请求。有两种可能的解决方案:

  • 使用Ehcache等框架进行数据缓存 - 以最佳方式加载数据。
  • 虽然与您的要求有所不同,但您可以使用加载JButton在用户提供完整String时加载数据。

<强>更新

短期内:

将SQL通配符添加到查询中以匹配部分字符串:

st.executeQuery("Select * from facultydtls where sub_code like '%" + jst + "%'");

从长远来看:

使用PreparedStatement。它有以下好处:

  • 防止SQL注入攻击,特别是考虑到用户可以输入属于SQL查询的字符串。
  • PreparedStatement占位符字符将包含任何必需的字符串引号。