Ява. Игнорировать/отключить ключевую функцию, но по-прежнему захватывать keyEvent

У меня есть JTextField, и я хочу записать keyEvent, когда сосредоточусь на нем. Это несложно, и я уже могу распечатать все названия клавиш (например, «F1», «ESCAPE», «A», «M»), кроме «TAB».

Проблема в том, что фокус будет меняться, когда я нажимаю «TAB», а символ удаляется, когда я нажимаю «BACKSPACE». Я хочу избежать этого, но сохранить keyEvent. Поэтому мне интересно, можно ли игнорировать функцию клавиши, когда я ее нажимаю. Любые идеи?


person Xingji Chen    schedule 01.11.2018    source источник
comment
Попробуйте внедрить фильтр документов, чтобы фильтровать любые действия всякий раз, когда вы печатаете в текстовом поле. Для получения дополнительной информации см. ссылки ниже: docs .oracle.com/javase/7/docs/api/javax/swing/text/   -  person Udaya Shankara Gandhi Thalabat    schedule 01.11.2018


Ответы (1)


Чтобы исключить функцию Tab-Away из JTextField, вам необходимо установить для его свойства setFocusTraversalKeysEnabled значение false. Как только это будет сделано, фокус не может быть потерян из JTextField нажатием клавиши TAB (или SHIFT-TAB), и тот факт, что клавиша TAB была нажата, может быть обнаружена в KeyPressed< JTextField. /сильное> событие.

Самый простой способ удалить функцию Backspace/Delete из JTextField — это использовать пользовательский Фильтр документов. Переопределение метода remove() фильтра пустым методом эффективно устраняет возможности клавиш Backspace или Delete.

Все это может быть достигнуто с использованием одного метода, который я предоставил ниже. Метод позволяет отключить или включить возможности Tab и Backspace из предоставленного 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);
    }
}

Как использовать этот метод:

// 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 установлено логическое значение false.

На данный момент предоставленный код дает возможность удалить возможности Tab-Away и Backspace/Delete, но, возможно, вы хотите оставить активную клавишу Delete и просто удалить возможности для клавиш TAB и BACKSPACE. Если это так, вы можете сделать это из события JTextField KeyPressed, нажав клавишу BACKSPACE:

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.

person DevilsHnd    schedule 01.11.2018