【问题标题】:Replace Keybinding In Text Field With Existing Action将文本字段中的键绑定替换为现有操作
【发布时间】:2020-09-16 21:30:11
【问题描述】:

我有一个JTextPane。对于Ctrl+Arrow 按下,我想要我自己的行为。

jTextEntryPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, Toolkit.getDefaultToolkit ().getMenuShortcutKeyMaskEx()), Controls.UP_ACTION);
jTextEntryPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, Toolkit.getDefaultToolkit ().getMenuShortcutKeyMaskEx()), Controls.DOWN_ACTION);
jTextEntryPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, Toolkit.getDefaultToolkit ().getMenuShortcutKeyMaskEx()), Controls.LEFT_ACTION);
jTextEntryPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, Toolkit.getDefaultToolkit ().getMenuShortcutKeyMaskEx()), Controls.RIGHT_ACTION);
jTextEntryPane.getActionMap().put(Controls.UP_ACTION, new MoveAction(Controls.UP_ACTION, this));
jTextEntryPane.getActionMap().put(Controls.DOWN_ACTION, new MoveAction(Controls.DOWN_ACTION, this));
jTextEntryPane.getActionMap().put(Controls.LEFT_ACTION, new MoveAction(Controls.LEFT_ACTION, this));
jTextEntryPane.getActionMap().put(Controls.RIGHT_ACTION, new MoveAction(Controls.RIGHT_ACTION, this));

Ctrl+UpCtrl+Down 工作。

Ctrl+LeftCtrl+Right 没有,而是被文本字段使用(转到输入字段的开头或结尾)。我想替换他们的行为,但我不想更改常规箭头(左右)的行为。我该怎么做?

【问题讨论】:

    标签: java swing user-interface text


    【解决方案1】:

    Ctrl+Up 和 Ctrl+Down 当前未定义为文本字段的键绑定,因此您只是添加新绑定,这就是它们起作用的原因。

    但是,Ctrl+Left 和 Ctrl+Right 已经定义为 JTextField 的绑定。它们是为WHEN_FOCUSED InputMap 定义的,其优先级高于WHEN_IN_FOCUSED_WINDOW InputMap。

    jTextEntryPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)....
    

    您的所有绑定都使用了错误的 InputMap。

    你应该使用:

    jTextEntryPane.getInputMap()....
    

    这将使用WHEN_FOCUSED InputMap。

    这将允许您替换默认操作。

    有关显示每个组件的所有默认绑定的简单程序,请参阅 Key Bindings

    编辑:

    键绑定不处理选项卡。它由焦点子系统处理,因此事件在到达文本字段之前被拦截。我相信以下应该有效:

    textField.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, null);
    textField.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, null);
    

    【讨论】:

    • 对不起,我还有一个问题。我想对 Tab 做同样的事情,但它不起作用。 jTextEntryPane.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, KeyEvent.KEY_PRESSED), "pressedAction"); jTextEntryPane.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, KeyEvent.KEY_RELEASED),releasedAction"); 不会触发相应的动作。我应该创建另一个问题,还是将其编辑到这个问题中?
    • @EternalAmbiguity,见编辑。如果它没有帮助,那么是的,它应该是一个单独的问题。
    猜你喜欢
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 2021-11-26
    相关资源
    最近更新 更多