【问题标题】:How to properly implement SHIFT + BACKSPACE key stroke inside of a JTextfield如何在 JTextfield 内正确实现 SHIFT + BACKSPACE 击键
【发布时间】:2012-08-16 04:14:41
【问题描述】:

所以我有一个基本的摇摆应用程序,它包含一个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 从文本框中删除字符?

【问题讨论】:

    标签: java swing keyboard-shortcuts jtextfield keylistener


    【解决方案1】:

    Stopping default behavior of events in Swing

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

    e.consume()
    

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

    【讨论】:

    • @kleopatra 什么?你的评论是针对我的吗?如果不是,请不要在此答案下发表评论,请在问题下发表评论。如果是对我来说,一些关于替代方案的解释会很好
    • 当然是发给你的(否则我为什么要评论和否决你的答案;)你有足够的经验来搜索......
    • @kleopatra 我只是不太在意,我已经有 10 多年没有编写 Java UI 代码了,我只是通过一个示例向用户指出了一个现有的答案。由于您对 Java UI 代码的良好实践了解更多,因此您最好指出为什么使用 keyListener 不好
    【解决方案2】:

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

    您应该利用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

    【讨论】:

      猜你喜欢
      • 2018-12-08
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      • 2019-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多