如果不是keyevents,我应该为屏幕键盘使用什么事件监听器?

aor9mmx1  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(409)

我的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();
} 
}

我知道我解释的方式很难理解。请容忍我。你们可以问更多的问题来更好地理解我的问题。谢谢!

deikduxw

deikduxw1#

所以我举了一个小例子来帮助你,但在此之前:
你的sql错误“连接太多”,你可能想这样做 con.close() 在所有地方,您都会像这样打开到数据库的连接:

Connection con = null
 try {
     // create the connection and do your database work here
 } catch (Exception ex) {
     // log your exception here
 } finally {
     if (con != null) {
         // finally lets close the connection (event in the event of a exception)
         con.close();
     }
 }

这个 DialogVirtualKeyboardReal 代码(不冒犯作者不是最好的,因为它不能很好地适应键盘不是模态的情况),所以你不能在打字时显示对话框,除非你使它成为模态,即通过 true 进入 DialogVirtualKeyboardReal 构造函数(我的示例就是这样做的),或者对实际 DialogVirtualKeyboardReal ,但这是一个全新的主题。
因为我的上述陈述,显示 JComboBox 弹出窗口,因为它可能会覆盖键盘。
说了这么多,我希望这能帮助你开始(我的) comboFilter 方法简单地模拟一个响应,就好像它是来自数据库的结果一样):

测试应用程序.java

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class TestApp {

    private JComboBox<String> jComboBox1;
    private final ArrayList<String> listOfNames = new ArrayList<>();

    public TestApp() {
        listOfNames.add("David Kroukamp");
        listOfNames.add("Abra");
        listOfNames.add("Camickr");
        listOfNames.add("Hovercraft Full Of Eels");
        listOfNames.add("Andrew Thompson");
        listOfNames.add("MadProgrammer");
        listOfNames.add("TrashGod");
        listOfNames.add("Gilbert Le Blanc");
        listOfNames.add("mKorbel");
        listOfNames.add("kleopatra");
        listOfNames.add("Reimeus");
        listOfNames.add("StanislavL");
        listOfNames.add("Paul Samsotha");
        listOfNames.add("Guillaume Polet");
        createAndShowGui();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(TestApp::new);
    }

    private void createAndShowGui() {
        JFrame frame = new JFrame("TestApp");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        jComboBox1 = new JComboBox<>(new DefaultComboBoxModel(listOfNames.toArray()));

        JLabel nameLabel = new JLabel("Name:");
        JTextField textField = new JTextField(20);
        textField.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent e) {
                comboFilter(textField.getText());
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                comboFilter(textField.getText());
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                // plain text components dont fire this
            }
        });

        JButton showKeyboardButton = new JButton("Show Keyboard");
        showKeyboardButton.addActionListener((ActionEvent e) -> {
            new DialogVirtualKeyboardReal(frame, true, textField);
        });

        JPanel panel = new JPanel();
        panel.add(nameLabel);
        panel.add(textField);
        panel.add(showKeyboardButton);

        frame.add(panel, BorderLayout.CENTER);
        frame.add(jComboBox1, BorderLayout.SOUTH);
        frame.pack();
        frame.setVisible(true);

        new DialogVirtualKeyboardReal(frame, false, textField);
    }

    public void comboFilter(String enteredText) {
        List<String> filterArray = new ArrayList<>();

        listOfNames.forEach((item) -> {
            if (item.contains(enteredText)) {
                filterArray.add(item);
            }
        });

        if (filterArray.size() > 0) {
            jComboBox1.setModel(new DefaultComboBoxModel(filterArray.toArray()));
            //jComboBox1.showPopup();
        } else {
            //jComboBox1.hidePopup();
        }
    }
}

相关问题