簡體   English   中英

Java。 忽略/禁用按鍵功能,但仍捕獲keyEvent

[英]Java. Ignore/disable key function but still capture the keyEvent

我有一個JTextField,當我專注於它時想記錄keyEvent。 這並不難,我已經可以打印出除“ TAB”以外的所有鍵名(例如“ F1”,“ ESCAPE”,“ A”,“ M”)。

問題是,當我按“ TAB”鍵時焦點會改變,而當我按“ BACKSPACE”鍵時字符會被刪除。 我想避免這種情況,但要保留ke​​yEvent。 因此,我想知道是否可以在按下按鍵時忽略按鍵功能。 有任何想法嗎?

要從JTextField中消除Tab-Away功能,您需要將其setFocusTraversalKeysEnabled屬性設置為false 完成此操作后,通過單擊TAB(或SHIFT-TAB)鍵,不會從JTextField失去焦點,並且可以在JTextField的KeyPressed事件中檢測到已按下TAB鍵的事實。

從JTextField刪除Backspace / Delete功能的最簡單方法是使用自定義DocumentFilter 通過使用空方法覆蓋過濾器的remove()方法,可以有效消除Backspace或Delete鍵功能。

所有這些都可以使用下面提供的單個方法來完成。 該方法允許您從提供的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);

雖然在提供的JTextField中禁用了TAB和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!");
    }
}  

您會注意到,當JTextField的setFocusTraversalKeysEnabled屬性設置為boolean 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM