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

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

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


慕妹3242003
浏览 214回答 1
1回答

素胚勾勒不出你

要从JTextField 中消除 Tab-Away 功能,您需要将其setFocusTraversalKeysEnabled属性设置为false。完成此操作后,无法通过按 TAB(或 SHIFT-TAB)键从 JTextField 丢失焦点,并且可以在 JTextField 的KeyPressed事件中检测到按下 TAB 键的事实。从 JTextField 中删除 Backspace/Delete 功能的最简单方法是使用自定义DocumentFilter。通过使用空方法覆盖过滤器的remove()方法,可以有效地消除退格键或删除键功能。这一切都可以通过使用我在下面提供的单一方法来完成。该方法允许您从提供的 JTextField 禁用或启用 Tab 和 Backspace 功能:/**&nbsp;* Disables (and can again Enable) the TAB (or SHIFT-TAB), BACKSPACE, and DELETE keys when&nbsp;&nbsp;* used within the supplied JTextField.<br><br>&nbsp;*&nbsp;&nbsp;* When the Tab key or Backspace key is hit then it can be detected within the&nbsp;&nbsp;* JTextField's KeyPressed Event by way of:<pre>&nbsp;*&nbsp;&nbsp;*&nbsp; &nbsp; &nbsp; if (event.getKeyCode() == KeyEvent.VK_TAB) {&nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("TAB Key Pressed!");&nbsp;*&nbsp; &nbsp; &nbsp; }&nbsp;&nbsp;*&nbsp; &nbsp; &nbsp; else if (event.getKeyCode() == KeyEvent.VK_BACK_SPACE) {&nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("BACKSPACE Key Pressed!");&nbsp;*&nbsp; &nbsp; &nbsp; }</pre>&nbsp;*&nbsp;&nbsp;* @param jtextfield (JTextField) The desired JTextField variable name to&nbsp;&nbsp;* control.<br>&nbsp;*&nbsp;&nbsp;* @param ON_OFF (Optional - Boolean - Default is true) If true (default) then&nbsp;&nbsp;* Tab and Backspace is not allowed within the supplied JTextField. If false is&nbsp;&nbsp;* supplied then Tab and Backspace is allowed within the supplied JTextField.&nbsp;*/public void noTABorBACKSPACE(JTextField jtextfield, boolean... ON_OFF) {&nbsp; &nbsp; boolean on = true;&nbsp; // Default ON - No Tab Away and No Backspace allowed.&nbsp; &nbsp; if (ON_OFF.length > 0) {&nbsp; &nbsp; &nbsp; &nbsp; on = ON_OFF[0];&nbsp; &nbsp; }&nbsp; &nbsp; if (on) {&nbsp; &nbsp; &nbsp; &nbsp; // Remove the TAB Away feature from the JTextField.&nbsp; &nbsp; &nbsp; &nbsp; jtextfield.setFocusTraversalKeysEnabled(!on);&nbsp; &nbsp; &nbsp; &nbsp; // Disable the Backspace feature from the JTextField.&nbsp; &nbsp; &nbsp; &nbsp; // This is done with a custom Document Filter.&nbsp; &nbsp; &nbsp; &nbsp; ((AbstractDocument) jtextfield.getDocument()).setDocumentFilter(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new DocumentFilter(){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // By overriding the remove() method with an empty remove()&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // method we effectively eliminate Backspace capabilities.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void remove(DocumentFilter.FilterBypass fb, int i, int i1)&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throws BadLocationException {&nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; );&nbsp; &nbsp; }&nbsp; &nbsp; else {&nbsp; &nbsp; &nbsp; &nbsp; // Re-enable the TAB Away feature for the JTextField.&nbsp; &nbsp; &nbsp; &nbsp; jtextfield.setFocusTraversalKeysEnabled(!on);&nbsp; &nbsp; &nbsp; &nbsp; // Re-enable the Backspace feature for the JTextField.&nbsp; &nbsp; &nbsp; &nbsp; // This is done by removing our custom Document Filter.&nbsp; &nbsp; &nbsp; &nbsp; ((AbstractDocument) jtextfield.getDocument()).setDocumentFilter(null);&nbsp; &nbsp; }}如何使用此方法:// To disable TAB and BACKSPACEnoTABorBACKSPACE(jTextField1);//&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;OR// noTABorBACKSPACE(jTextField1, true);&nbsp; &nbsp;// To re-enable TAB and BACKSPACEnoTABorBACKSPACE(jTextField1, false);虽然 TAB 和 BACKSPACE 功能在提供的 JTextField 中被禁用,但您可以确定是否通过 JTextField 的KeyPressed事件按下了这些特定键,例如:private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; if (evt.getKeyCode() == KeyEvent.VK_TAB) {&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("TAB Key Hit!");&nbsp; &nbsp; }&nbsp; &nbsp; else if (evt.getKeyCode() == KeyEvent.VK_BACK_SPACE) {&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("BACKSPACE Key Hit!");&nbsp; &nbsp; }}&nbsp;&nbsp;您会注意到,当 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) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; if (evt.getKeyCode() == KeyEvent.VK_TAB) {&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("TAB Key Hit!");&nbsp; &nbsp; }&nbsp; &nbsp; else if (evt.getKeyCode() == KeyEvent.VK_BACK_SPACE) {&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("BACKSPACE Key Hit!");&nbsp; &nbsp; &nbsp; &nbsp; evt.consume(); // Consume the BACKSPACE Key Press.&nbsp; &nbsp; }}&nbsp;&nbsp;要阻止 TAB 键移动焦点,您仍然需要将setFocusTraversalKeysEnabled属性设置为false。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java