问题描述
我自定义了 JTextField
来输入数值。该类如下所示:
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
public class JNumberField extends JTextField {
public JNumberField(int width,int height) {
this();
setPreferredSize(new Dimension(width,height));
}
public JNumberField() {
setFont(new Font("Monospace",Font.BOLD,23));
setHorizontalAlignment(JTextField.HORIZONTAL);
}
@Override
public void processKeyEvent(KeyEvent ev) {
//Accepts digits,backspace,minus key and left/right arrow keys
if (Character.isDigit(ev.getKeyChar()) || ev.getKeyCode() == KeyEvent.VK_BACK_SPACE || ev.getKeyCode() == KeyEvent.VK_MINUS || ev.getKeyCode() == KeyEvent.VK_LEFT || ev.getKeyCode() == KeyEvent.VK_RIGHT) {
super.processKeyEvent(ev);
}
ev.consume();
}
public static void main(String[] args) {
JOptionPane.showInputDialog(new JNumberField(300,50));
}
}
除“-”键外,所有键都有效。我还打印了按下的键码,它以 45 响应,因此执行 if 语句但它不会将 - 插入到文本字段中。这是一个错误还是如何修复?我还尝试删除 if 语句并只调用 processKeyEvent
方法,然后它可以插入 - 符号...
解决方法
首先我完全同意 Andrew,有更好的解决方案来解决问题。例如你可以使用:
- a
JSpinner
- a
JFormattedTextField
- a
DocumentFilter
- 参见:How to automatically update small letter characters to capital letter in Java JEditorPane?
上述解决方案更好的原因是:
- 你不需要扩展一个类
- 解决方案更抽象
您的解决方案是低级解决方案,这意味着您需要了解按下某个键时生成的事件以及 Swing 如何处理这些事件。
更抽象的解决方案总是更好,因为您不需要知道细节。这就是 Swing API 不断发展的原因。
在您的情况下,您不了解“可显示”键事件和“不可显示”事件之间的区别。
文本组件在生成 keyTyped
事件时更新,该事件仅针对“数字”和“-”等“可显示”字符生成。
使用箭头键或退格键不会生成“keyTyped”事件。
因此您的逻辑需要更改以将“-”作为字符(而不是键代码)处理:
//if (Character.isDigit(ev.getKeyChar()) || ev.getKeyCode() == KeyEvent.VK_MINUS ...
if (Character.isDigit(ev.getKeyChar()) || ev.getKeyChar() == '-' ...