【发布时间】:2021-04-01 01:48:55
【问题描述】:
我的 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) {
}
});
这是 DialogVirtualKeyboardReal 的图片:
按键由 JButton 组成。
编辑: 我按照@Abra 的指示尝试了 DocumentListener。
键盘弹出,但在文本字段中输入 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();
}
}
我知道我解释的方式很难理解。请多多包涵。你们可能会问更多问题以更好地理解我的问题。非常感谢!
【问题讨论】:
-
它是一个JDialog,它是一个Swing Window。是的,它是 DialogVirtualKeyboardReal。
-
我添加了一张虚拟键盘@Abra 的图片,是的,按键是 JButtons
-
因此,当用户“按下”虚拟键盘上的某个键时,您希望您的应用程序以与他在
JTextField中输入字母相同的方式做出反应,对吗?其实这个JTextField其实就是一个可编辑JComboBox的编辑器组件吧? -
是的。确切地。对不起,我不能很好地解释它。
-
发布一些重现您的问题的代码,以便您可以更快地获得更好的帮助。
标签: java swing events jtextfield on-screen-keyboard