Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

simulate backspace key with java.awt.Robot

There seems to be an issue simulating the backspace key with java.awt.Robot.

This thread seems to confirm this but it does not propose a solution.

This works:

Robot rob = new Robot();
rob.keyPress(KeyEvent.VK_A);
rob.keyRelease(KeyEvent.VK_A);

This doesn't:

Robot rob = new Robot();
rob.keyPress(KeyEvent.VK_BACK_SPACE);
rob.keyRelease(KeyEvent.VK_BACK_SPACE);

Any ideas?

like image 610
Tyler Avatar asked Apr 07 '10 23:04

Tyler


2 Answers

It seems to work in this test.

Addendum: Regarding the cited article, "Aside from those keys that are defined by the Java language (VK_ENTER, VK_BACK_SPACE, and VK_TAB), do not rely on the values of the VK_ constants. Sun reserves the right to change these values as needed to accomodate a wider range of keyboards in the future."—java.awt.event.KeyEvent

public class RobotTest {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                new RobotTest().create();
            }
        });
    }

    private void create() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocationRelativeTo(null);
        f.setLayout(new FlowLayout());
        f.add(new JTextField(8));
        final JButton b = new JButton();
        f.getRootPane().setDefaultButton(b);
        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                b.setText("@" + e.getWhen());
            }
        });
        f.add(b);
        f.setSize(256, 128);
        f.setVisible(true);
        doTest();
    }

    private void doTest() {
        try {
            Robot r = new Robot();
            int[] keys = {
                KeyEvent.VK_T, KeyEvent.VK_E,
                KeyEvent.VK_S, KeyEvent.VK_T,
                KeyEvent.VK_Z, KeyEvent.VK_BACK_SPACE,
                KeyEvent.VK_ENTER
            };
            for (int code : keys) {
                r.keyPress(code);
                r.keyRelease(code);
            }
        } catch (AWTException ex) {
            ex.printStackTrace(System.err);
        }
    }
}
like image 66
trashgod Avatar answered Oct 10 '22 03:10

trashgod


The Backspace functionality does not work as expected. I added a Shift key with the Backspace and it works fine for me, here is the pseudo-code for it.

robot.keyPress(KeyEvent.VK_SHIFT);
robot.keyPress(KeyEvent.VK_BACK_SPACE);
robot.keyRelease(KeyEvent.VK_BACK_SPACE);
robot.keyRelease(KeyEvent.VK_SHIFT);

This does not seem to work for the Delete key though.

like image 24
Todd Senauskas Avatar answered Oct 10 '22 01:10

Todd Senauskas