2

所以我有一个基本的摇摆应用程序,它包含一个JTextfield,我添加以下KeyListener内容:

public class PromptKeyListener implements KeyListener {

    private boolean SHIFT_PRESSED;

    @Override
    public void keyPressed(KeyEvent e) {

        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
            //Do Thing A
        } else if (e.getKeyCode() == KeyEvent.VK_SHIFT) {
            this.SHIFT_PRESSED = true;
        }

                     if (SHIFT_PRESSED
                && e.getKeyCode() == KeyEvent.VK_BACK_SPACE) {
            //Do Thing B
        }

       }

    @Override
    public void keyReleased(KeyEvent e) {

        if (e.getKeyCode() == KeyEvent.VK_SHIFT) {
            this.SHIFT_PRESSED = false;
        }
        System.out.println(SHIFT_PRESSED);
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

}

问题是当我按住 SHIFT 和 Backspace 时,事情 B 确实发生了,但 Backspace 键也像往常一样从文本框中删除了一个字符。

按住 SHIFT 时,有没有办法防止 Backspace 从文本框中删除字符?

4

2 回答 2

3

虽然解决方案有效,但您采取了错误的方法(恕我直言)。

您应该利用KeyBindings API

InputMap im = field.getInputMap(JComponent.WHEN_FOCUSED);
ActionMap am = field.getActionMap();

im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, KeyEvent.SHIFT_DOWN_MASK), "DoThingB");
am.put("DoThingB", new AbstractAction() {

    @Override
    public void actionPerformed(ActionEvent e) {

        System.out.println("Do Think B");

    }
});

此外,您不应该使用 aKeyListener来捕获enter密钥,而应该使用ActionListener

于 2012-08-21T00:13:21.307 回答
2

请参阅在 Swing 中停止事件的默认行为

那个答案说你应该可以打电话

e.consume()

以防止文本进入字段的默认行为。

于 2012-08-20T20:06:23.660 回答