如何在JTextfield中正确实现SHIFT + BACKSPACE键击

时间:2012-08-20 20:03:22

标签: java swing keyboard-shortcuts jtextfield keylistener

所以我有一个基本的swing应用程序,它包含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 Thing B确实发生但Backspace键也会像往常一样从文本框中删除单个字符。

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

2 个答案:

答案 0 :(得分: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");

    }
});

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

答案 1 :(得分:2)

请参阅Stopping default behavior of events in Swing

答案说你应该可以致电

e.consume()

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