简体   繁体   English

java.awt.Robot keyPress事件持续按下

[英]java.awt.Robot keyPress event is keep on pressing

I am trying to create my own virtual keyboard in Java. 我正在尝试用Java创建自己的虚拟键盘。 I am using Robot's keyPress() event to trigger the KeyEvent to a text field. 我正在使用Robot的keyPress()事件将KeyEvent触发到文本字段。 Key event is working but it keep on printing the key that I pressed. 按键事件正在运行,但它会继续打印我按下的按键。 Here is my code please check what I am doing wrong? 这是我的代码,请检查我做错了什么?

Code for creating keyboard 创建键盘的代码

package virtualkeyboard;

import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JTextField;

public class Keyboard extends JDialog {

    private static final long serialVersionUID = 1L;

    private JTextField txtField;

    public Keyboard(JTextField txt) {

        this.txtField = txt;
        setModalityType(ModalityType.APPLICATION_MODAL);
        setLayout(new GridLayout(3, 3));

        for (int i = 0; i <= 9; i++){
            createButton(Integer.toString(i));
        }

        pack();
    }

    private void createButton(String label) {
        JButton btn = new JButton(label);
        btn.setFocusPainted(false);
        btn.setPreferredSize(new Dimension(100, 100));
        Font font = btn.getFont();
        float size = font.getSize() + 15.0f;
        btn.setFont(font.deriveFont(size));

        btn.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseReleased(MouseEvent e) {

                txtField.requestFocus();

                Robot robot;

                try {

                    robot = new Robot();

                    if(label.equals("0"))
                        robot.keyPress(KeyEvent.VK_0);
                    else if(label.equals("1"))
                        robot.keyPress(KeyEvent.VK_1);
                    else if(label.equals("2"))
                        robot.keyPress(KeyEvent.VK_2);
                    else if(label.equals("3"))
                        robot.keyPress(KeyEvent.VK_3);
                    else if(label.equals("4"))
                        robot.keyPress(KeyEvent.VK_4);
                    else if(label.equals("5"))
                        robot.keyPress(KeyEvent.VK_5);
                    else if(label.equals("6"))
                        robot.keyPress(KeyEvent.VK_6);
                    else if(label.equals("7"))
                        robot.keyPress(KeyEvent.VK_7);
                    else if(label.equals("8"))
                        robot.keyPress(KeyEvent.VK_8);
                    else if(label.equals("9"))
                        robot.keyPress(KeyEvent.VK_9);

                } catch (AWTException e1) {
                    e1.printStackTrace();
                }
            }
        });

        add(btn);
    }
}

Window with a textfield 带有文本字段的窗口

package virtualkeyboard;

import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JDialog;
import javax.swing.JTextField;

public class WindowOne extends JDialog {

    private JTextField txtField = new JTextField();

    private Keyboard keyboard = new Keyboard(txtField);

    public WindowOne(){

        setSize(new Dimension(250,30));

        txtField.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if(isEnabled()){
                    Point p = getLocationOnScreen();
                    p.y += 30;
                    keyboard.setLocation(p);
                    keyboard.setVisible(true);
                }
            }
        });

        add(txtField);

    }

    public static void main(String[] args) {
        new WindowOne().setVisible(true);
    }

}

Edits: 编辑:

I made the following changes in code and made the JTextfield focusable while press the button. 我在代码中进行了以下更改,并在按下按钮时使JTextfield具有焦点。

private void createButton(String label,JTextField txt) {

        JButton btn = new JButton(label);
        btn.setFocusPainted(false);
        btn.setPreferredSize(new Dimension(100, 100));
        Font font = btn.getFont();
        float size = font.getSize() + 15.0f;
        btn.setFont(font.deriveFont(size));
        btn.setFocusable(false);

        btn.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent e) {

                txt.getParent().requestFocus();
                txt.requestFocus();

                robot.delay(100);

                if(label.equals("0"))
                    robot.keyPress(KeyEvent.VK_0);
                else if(label.equals("1"))
                    robot.keyPress(KeyEvent.VK_1);
                else if(label.equals("2"))
                    robot.keyPress(KeyEvent.VK_2);
                else if(label.equals("3"))
                    robot.keyPress(KeyEvent.VK_3);
                else if(label.equals("4"))
                    robot.keyPress(KeyEvent.VK_4);
                else if(label.equals("5"))
                    robot.keyPress(KeyEvent.VK_5);
                else if(label.equals("6"))
                    robot.keyPress(KeyEvent.VK_6);
                else if(label.equals("7"))
                    robot.keyPress(KeyEvent.VK_7);
                else if(label.equals("8"))
                    robot.keyPress(KeyEvent.VK_8);
                else if(label.equals("9"))
                    robot.keyPress(KeyEvent.VK_9);

                requestFocusInWindow();
            }
        });
        add(btn);
    }

If I press a button it's keep on printing the number in textfield. 如果我按下按钮,它将继续在文本字段中打印数字。 But event is fired only once. 但是事件只被触发一次。

Please check. 请检查。

I got the solution for my problem, 我为我的问题找到了解决方案,

For every keyPress event we need to trigger the appropriate keyRelease event then only it will stop the keyPress event, otherwise it will considred as a long press. 对于每个keyPress事件,我们都需要触发相应的keyRelease事件,然后才停止keyPress事件,否则将其视为长按。

Changed this line 更改了这一行

if(keyCode.equals("VK_0")){
    robot.keyPress(KeyEvent.VK_0);
}

to

if(keyCode.equals("VK_0")){
    robot.keyPress(KeyEvent.VK_0);
    robot.keyRelease(KeyEvent.VK_0);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM