JAVA忽略/禁用按键功能,但仍捕获按键事件

JAVA忽略/禁用按键功能,但仍捕获按键事件,java,keyevent,Java,Keyevent,我有一个JTextField,当我关注它时,我想记录keyEvent。 这并不难,我已经可以打印出除“TAB”之外的所有键名(如“F1”、“ESCAPE”、“A”、“M”) 问题是,当我按“TAB”时焦点会改变,当我按“BACKSPACE”时一个字符会被删除。我想避免这种情况,但保留keyEvent。所以我想知道当我按下按键时是否可以忽略按键功能。有什么想法吗?要从JTextField中删除Tab-Away功能,您需要将其setFocusTraversalKeysEnabled属性设置为fals

我有一个JTextField,当我关注它时,我想记录keyEvent。 这并不难,我已经可以打印出除“TAB”之外的所有键名(如“F1”、“ESCAPE”、“A”、“M”)


问题是,当我按“TAB”时焦点会改变,当我按“BACKSPACE”时一个字符会被删除。我想避免这种情况,但保留keyEvent。所以我想知道当我按下按键时是否可以忽略按键功能。有什么想法吗?

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

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

这一切都可以通过使用我在下面提供的单一方法来实现。该方法允许您从提供的JTextField中禁用或启用制表符和退格功能:

/**
 * 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);
    }
}
在提供的JTextField中禁用制表符和退格功能时,您可以通过JTextField的按键按下事件来确定是否按下了这些特定键,例如:

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.
    }
}  
您会注意到,当JTextField的setFocusTraversalKeysEnabled属性设置为booleantrue时,您将无法检测TAB键何时被点击,这是因为TAB键总是被用户使用。当setFocusTraversalKeysEnabled属性设置为布尔false时,情况并非如此

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


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

尝试实现文档过滤器,以便在文本字段中键入时过滤任何操作。请参阅以下链接以获取更多信息:
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!");
    }
}  
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.
    }
}