尝试处理减号键

问题描述

自定义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,有更好的解决方案来解决问题。例如你可以使用:

  1. a JSpinner
  2. a JFormattedTextField
  3. a DocumentFilter - 参见:How to automatically update small letter characters to capital letter in Java JEditorPane?

上述解决方案更好的原因是:

  1. 你不需要扩展一个类
  2. 解决方案更抽象

您的解决方案是低级解决方案,这意味着您需要了解按下某个键时生成的事件以及 Swing 如何处理这些事件。

更抽象的解决方案总是更好,因为您不需要知道细节。这就是 Swing API 不断发展的原因。

在您的情况下,您不了解“可显示”键事件和“不可显示”事件之间的区别。

文本组件在生成 keyTyped 事件时更新,该事件仅针对“数字”和“-”等“可显示”字符生成。

使用箭头键或退格键不会生成“keyTyped”事件。

因此您的逻辑需要更改以将“-”作为字符(而不是键代码)处理:

//if (Character.isDigit(ev.getKeyChar()) || ev.getKeyCode() == KeyEvent.VK_MINUS ...
if (Character.isDigit(ev.getKeyChar()) || ev.getKeyChar() == '-' ...