我的java swing程序中有这样一段代码:
JTextField textfield = (JTextField) txtNameID.getEditor().getEditorComponent();
textfield.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent ke) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
comboFilter(textfield.getText());
}
});
}
});
它的功能是显示数据库中的名称,就像在文本字段中键入的一样。一旦用户开始输入,它就会出现。
这样地:
这在使用硬键盘时效果很好。但我的问题是我必须使用屏幕上的键盘/虚拟键盘来执行这个程序,而keylistener不能使用它。现在我不知道应该使用哪种类型的事件侦听器。我试过mouselistener,但也没用。我希望有办法。我的项目真的需要这个。请帮帮我。
这是我的屏幕键盘代码(在同一个类中,在另一个类中有较长的代码):
textfield.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
DialogVirtualKeyboardReal dlg = new DialogVirtualKeyboardReal(this, false, textfield);
dlg.setLocaleL(locale);
}
});
textfield.addMouseListener(new MouseListener() {
@Override
public void mousePressed(MouseEvent me) {
DialogVirtualKeyboardReal dlg = new DialogVirtualKeyboardReal(r, false, textfield);
dlg.setLocaleL(locale);
}
@Override
public void mouseReleased(MouseEvent me) {
}
@Override
public void mouseEntered(MouseEvent me) {
}
@Override
public void mouseExited(MouseEvent me) {
}
@Override
public void mouseClicked(MouseEvent me) {
}
});
以下是对话VirtualKeyboardReal的图片:
钥匙是用钮扣做的。
编辑:我试着遵循@abra的指示。
键盘弹出,但在文本字段中键入1个字母后,键盘消失,文本字段下的名称弹出。
即使我在虚拟键盘上打字,combofilter也会出现,这很好。但我希望它同时执行,在虚拟键盘上键入时,combofilter应该出现。
另一件事是我的数据库出错了。
这是我创建的代码:
JTextField textfield = (JTextField) txtNameID.getEditor().getEditorComponent();
textfield.getDocument().addDocumentListener(new DocumentListener(){
@Override
public void insertUpdate(DocumentEvent de) {
filter();
}
@Override
public void removeUpdate(DocumentEvent de) {
filter();
}
@Override
public void changedUpdate(DocumentEvent de) {
filter();
}
public void filter(){
SwingUtilities.invokeLater(new Runnable() {
public void run() {
comboFilter(textfield.getText());
}});
} });
错误是:
errorcom.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"
combofilter()代码是:
public void comboFilter(String enteredText) {
List<String> filterArray= new ArrayList<String>();
String lname="";
String fname= "";
String mi= "";
String id= "";
try{
String str="SELECT * FROM patient_record WHERE firstname LIKE '"+enteredText+"%' OR lastname LIKE '"+enteredText+"%' OR patient_id LIKE '"+enteredText+"%'";
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost/patient";
Connection con = DriverManager.getConnection(url,"root","");
Statement stmt=con.createStatement();
ResultSet rs=stmt.executeQuery(str);
while(rs.next()){
lname=rs.getString("lastname");
fname= rs.getString("firstname");
mi= rs.getString("middlename");
id= rs.getString("patient_id");
String str1 = lname+", "+fname+" "+mi+". \t"+id;
filterArray.add(str1);
}}
catch(Exception ex){
System.out.println("error"+ex);
}
if (filterArray.size() > 0) {
jComboBox1.setModel(new DefaultComboBoxModel(filterArray.toArray()));
jComboBox1.setSelectedItem(enteredText);
jComboBox1.showPopup();
}
else {
jComboBox1.hidePopup();
}
}
我知道我解释的方式很难理解。请容忍我。你们可以问更多的问题来更好地理解我的问题。谢谢!
1条答案
按热度按时间deikduxw1#
所以我举了一个小例子来帮助你,但在此之前:
你的sql错误“连接太多”,你可能想这样做
con.close()
在所有地方,您都会像这样打开到数据库的连接:这个
DialogVirtualKeyboardReal
代码(不冒犯作者不是最好的,因为它不能很好地适应键盘不是模态的情况),所以你不能在打字时显示对话框,除非你使它成为模态,即通过true
进入DialogVirtualKeyboardReal
构造函数(我的示例就是这样做的),或者对实际DialogVirtualKeyboardReal
,但这是一个全新的主题。因为我的上述陈述,显示
JComboBox
弹出窗口,因为它可能会覆盖键盘。说了这么多,我希望这能帮助你开始(我的)
comboFilter
方法简单地模拟一个响应,就好像它是来自数据库的结果一样):测试应用程序.java