为了账号安全,请及时绑定邮箱和手机立即绑定

爪哇。忽略/禁用键功能但仍捕获 keyEvent

爪哇。忽略/禁用键功能但仍捕获 keyEvent

慕妹3242003 2021-12-22 16:09:53
我有一个 JTextField,我想在关注它时记录 keyEvent。这并不难,我已经可以打印出除“TAB”之外的所有键名(例如“F1”、“ESCAPE”、“A”、“M”)。问题是,当我按“TAB”键时焦点会改变,当我按“BACKSPACE”键时会删除一个字符。我想避免这种情况,但保留 keyEvent。所以我想知道是否可以在按下时忽略按键功能。有任何想法吗?
查看完整描述

1 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

要从JTextField 中消除 Tab-Away 功能,您需要将其setFocusTraversalKeysEnabled属性设置为false。完成此操作后,无法通过按 TAB(或 SHIFT-TAB)键从 JTextField 丢失焦点,并且可以在 JTextField 的KeyPressed事件中检测到按下 TAB 键的事实。


从 JTextField 中删除 Backspace/Delete 功能的最简单方法是使用自定义DocumentFilter。通过使用空方法覆盖过滤器的remove()方法,可以有效地消除退格键或删除键功能。


这一切都可以通过使用我在下面提供的单一方法来完成。该方法允许您从提供的 JTextField 禁用或启用 Tab 和 Backspace 功能:


/**

 * Disables (and can again Enable) the TAB (or SHIFT-TAB), BACKSPACE, and DELETE keys when 

 * used within the supplied JTextField.<br><br>

 * 

 * When the Tab key or Backspace key is hit then it can be detected within the 

 * JTextField's KeyPressed Event by way of:<pre>

 * 

 *      if (event.getKeyCode() == KeyEvent.VK_TAB) {

 *          System.out.println("TAB Key Pressed!");

 *      } 

 *      else if (event.getKeyCode() == KeyEvent.VK_BACK_SPACE) {

 *          System.out.println("BACKSPACE Key Pressed!");

 *      }</pre>

 * 

 * @param jtextfield (JTextField) The desired JTextField variable name to 

 * control.<br>

 * 

 * @param ON_OFF (Optional - Boolean - Default is true) If true (default) then 

 * Tab and Backspace is not allowed within the supplied JTextField. If false is 

 * supplied then Tab and Backspace is allowed within the supplied JTextField.

 */

public void noTABorBACKSPACE(JTextField jtextfield, boolean... ON_OFF) {

    boolean on = true;  // Default ON - No Tab Away and No Backspace allowed.

    if (ON_OFF.length > 0) {

        on = ON_OFF[0];

    }

    if (on) {

        // Remove the TAB Away feature from the JTextField.

        jtextfield.setFocusTraversalKeysEnabled(!on);


        // Disable the Backspace feature from the JTextField.

        // This is done with a custom Document Filter.

        ((AbstractDocument) jtextfield.getDocument()).setDocumentFilter(

            new DocumentFilter(){

                @Override

                // By overriding the remove() method with an empty remove() 

                // method we effectively eliminate Backspace capabilities.

                public void remove(DocumentFilter.FilterBypass fb, int i, int i1) 

                    throws BadLocationException {  }

            }

        );

    }

    else {

        // Re-enable the TAB Away feature for the JTextField.

        jtextfield.setFocusTraversalKeysEnabled(!on);


        // Re-enable the Backspace feature for the JTextField.

        // This is done by removing our custom Document Filter.

        ((AbstractDocument) jtextfield.getDocument()).setDocumentFilter(null);

    }

}

如何使用此方法:


// To disable TAB and BACKSPACE

noTABorBACKSPACE(jTextField1);

//         OR

// noTABorBACKSPACE(jTextField1, true);   


// To re-enable TAB and BACKSPACE

noTABorBACKSPACE(jTextField1, false);

虽然 TAB 和 BACKSPACE 功能在提供的 JTextField 中被禁用,但您可以确定是否通过 JTextField 的KeyPressed事件按下了这些特定键,例如:


private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {                                       

    if (evt.getKeyCode() == KeyEvent.VK_TAB) {

        System.out.println("TAB Key Hit!");

    }

    else if (evt.getKeyCode() == KeyEvent.VK_BACK_SPACE) {

        System.out.println("BACKSPACE Key Hit!");

    }

}  

您会注意到,当 JTextField 的setFocusTraversalKeysEnabled属性设置为布尔值true 时,您将无法检测到 TAB 键何时被击中,这是因为 TAB 键始终由KeyboardFocusManager 使用。当setFocusTraversalKeysEnabled属性设置为 boolean false时,情况并非如此。


到目前为止,提供的代码提供了删除 Tab-Away 和 Backspace/Delete 功能的方法,但也许您希望保持Delete键处于活动状态,而只删除 TAB 和 BACKSPACE 键的功能。如果是这种情况,那么您可以通过使用 BACKSPACE 按键在 JTextField 的KeyPressed事件中执行此操作:


private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {                                       

    if (evt.getKeyCode() == KeyEvent.VK_TAB) {

        System.out.println("TAB Key Hit!");

    }

    else if (evt.getKeyCode() == KeyEvent.VK_BACK_SPACE) {

        System.out.println("BACKSPACE Key Hit!");

        evt.consume(); // Consume the BACKSPACE Key Press.

    }

}  

要阻止 TAB 键移动焦点,您仍然需要将setFocusTraversalKeysEnabled属性设置为false。


查看完整回答
反对 回复 2021-12-22
  • 1 回答
  • 0 关注
  • 213 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号