2016-11-24 87 views
1

我想开发自动建议Textfield。当我在文本字段我打字这是一个延时键和提示一个键晚**如何解决一个keyPressed在java swing中延迟?

当我按在list.When我打字AAA它查询只为“AA”,并建议按AAA后,然后将查询为aaa

private void initialize() { 
    frame = new JFrame(); 
    frame.setBounds(100, 100, 450, 300); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().setLayout(null); 

    JPanel panel = new JPanel(); 
    panel.setBounds(10, 11, 414, 239); 
    frame.getContentPane().add(panel); 
    panel.setLayout(null); 

    textField = new JTextField(); 
    textField.addKeyListener(new KeyAdapter() { 
     @Override 
     public void keyPressed(KeyEvent arg0) { 

      try { 

       addListItem(); 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }); 
    textField.setBounds(71, 24, 86, 20); 
    panel.add(textField); 
    textField.setColumns(10); 

    list = new JList<String>(); 

    list.setBounds(71, 55, 86, 97); 
    list.setVisible(false); 
    list.getScrollableTracksViewportHeight(); 

    panel.add(list); 
} 

public void addListItem() throws Exception { 

    list.setVisible(true); 

    Class.forName("com.mysql.jdbc.Driver"); 
    c = DriverManager.getConnection("jdbc:mysql://localhost:3306/studentdemo", "root", "root"); 
    ps = c.prepareStatement(
      "SELECT stud_name FROM student_info where stud_name like '" + textField.getText().trim() + "%' "); 
    ResultSet s = ps.executeQuery(); 

    model = new DefaultListModel<String>(); 
    while (s.next()) { 
     model.addElement(s.getString("stud_name")); 
     System.out.println(s.getString("stud_name")); 

    } 
    list.setModel(model); 

} 
+0

使用'keyReleased'? – Berger

+0

我应该在keyReleased中写什么? @Berger – Nilay

+0

只需使用'keyPressed'的'keyReleased' INSTEAD。 – Berger

回答

0

使用keyReleased,而不是KeyAdapter类的keyPressed方法的任意键(额外的按键)。

+0

谢谢你的工作。 。当我清除textfield它仍然会显示我填充列表。 – Nilay

+0

这是因为按下退格键清除文本框时将调用keyPressed事件,再加上没有从列表中删除项目的逻辑。我会建议在退格按键上添加删除逻辑。如下所示: public void keyPressed(KeyEvent arg0)if(arg0.getKeyCode()== KeyEvent.VK_BACK_SPACE)//从列表中删除项目; – vvtx

+0

谢谢,我通过检查textfield是否为空来解决它。 – Nilay