java.awt.Robot keyPress 事件持续按下
java.awt.Robot keyPress event is keep on pressing
我正在尝试在 Java 中创建自己的虚拟键盘。我正在使用 Robot 的 keyPress() 事件将 KeyEvent 触发到文本字段。按键事件正在运行,但它继续打印我按下的键。这是我的代码,请检查我做错了什么?
创建键盘的代码
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 带有文本字段
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);
}
}
编辑:
我对代码进行了以下更改,并在按下按钮时使 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);
}
如果我按下按钮,它会继续在文本字段中打印数字。但是事件只触发一次。
请检查。
我找到了问题的解决方案,
对于每个 keyPress 事件,我们都需要触发相应的 keyRelease 事件,然后它才会停止 keyPress 事件,否则将被视为长按。
更改了这一行
if(keyCode.equals("VK_0")){
robot.keyPress(KeyEvent.VK_0);
}
至
if(keyCode.equals("VK_0")){
robot.keyPress(KeyEvent.VK_0);
robot.keyRelease(KeyEvent.VK_0);
}
我正在尝试在 Java 中创建自己的虚拟键盘。我正在使用 Robot 的 keyPress() 事件将 KeyEvent 触发到文本字段。按键事件正在运行,但它继续打印我按下的键。这是我的代码,请检查我做错了什么?
创建键盘的代码
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 带有文本字段
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);
}
}
编辑:
我对代码进行了以下更改,并在按下按钮时使 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);
}
如果我按下按钮,它会继续在文本字段中打印数字。但是事件只触发一次。
请检查。
我找到了问题的解决方案,
对于每个 keyPress 事件,我们都需要触发相应的 keyRelease 事件,然后它才会停止 keyPress 事件,否则将被视为长按。
更改了这一行
if(keyCode.equals("VK_0")){
robot.keyPress(KeyEvent.VK_0);
}
至
if(keyCode.equals("VK_0")){
robot.keyPress(KeyEvent.VK_0);
robot.keyRelease(KeyEvent.VK_0);
}