Java。 Ignore/disable 按键功能但仍捕获 keyEvent
Java. Ignore/disable key function but still capture the keyEvent
我有一个JTextField,我想在关注它时记录keyEvent。
这并不难,我已经可以打印出除 "TAB".[=12 之外的所有键名(例如 "F1"、"ESCAPE"、"A"、"M") =]
问题是,当我按 "TAB" 时焦点会改变,当我按 "BACKSPACE" 时会删除一个字符。我想避免这种情况但保留 keyEvent。所以我想知道是否可以在按下时忽略按键功能。有什么想法吗?
要消除 JTextField 的 Tab-Away 功能,您需要将其 setFocusTraversalKeysEnabled 属性 设置为 假。完成此操作后,不会通过按 TAB(或 SHIFT-TAB)键从 JTextField 丢失焦点,并且按下 TAB 键的事实 可以 在 JTextField 的 KeyPressed 事件。
从 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);
虽然在提供的 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 属性 设置为布尔值 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。
我有一个JTextField,我想在关注它时记录keyEvent。 这并不难,我已经可以打印出除 "TAB".[=12 之外的所有键名(例如 "F1"、"ESCAPE"、"A"、"M") =]
问题是,当我按 "TAB" 时焦点会改变,当我按 "BACKSPACE" 时会删除一个字符。我想避免这种情况但保留 keyEvent。所以我想知道是否可以在按下时忽略按键功能。有什么想法吗?
要消除 JTextField 的 Tab-Away 功能,您需要将其 setFocusTraversalKeysEnabled 属性 设置为 假。完成此操作后,不会通过按 TAB(或 SHIFT-TAB)键从 JTextField 丢失焦点,并且按下 TAB 键的事实 可以 在 JTextField 的 KeyPressed 事件。
从 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);
虽然在提供的 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 属性 设置为布尔值 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。