0

我有一个 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");
        }
            }
        }
    });
4

2 回答 2

2
  1. 如果您想对用户输入做出反应,aDocumentListener是比 a 更好的方法KeyListener
  2. 您可以选择一个ActionListener,当用户点击时触发ENTER
  3. 您不应在事件调度线程上执行数据库查询。请改用工作线程。有关更多信息,请参阅Swing 中的并发
  4. close语句应放在一个finally块中

话虽这么说,你到底在问什么?

于 2012-11-01T15:38:00.913 回答
2

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

数据库查询需要大量资源,并且应该在EDT之外完成,以防止 UI “冻结”。看看SwingWorker在这个例子中使用。

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

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

更新:

在短期内:

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

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

在长期:

使用PreparedStatement. 它有以下好处:

  • 防止 SQL 注入攻击,特别是考虑到用户可以输入作为 SQL 查询一部分的字符串。
  • PreparedStatement占位符字符将采用任何必需的字符串引号。
于 2012-11-01T15:47:18.047 回答