Как перехватывать нажатия клавиш, идущие в Java Swing JTextField?

JTextField — это дисплей калькулятора, инициализированный нулем, и отображать десятичное число с начальным 0, например 0123 или 00123, является дурным тоном. Цифровые кнопки (0..9) в JFrame NetBeans Swing используют append() [ниже] для отбросить начальные нули, но пользователь может предпочесть клавиатуру мыши, а также необходимо обрабатывать нечисловые символы.

private void append(String s) {
    if (newEntry) {
        newEntry = false;
        calcDisplay.setText(s);
    } else if (0 != Float.parseFloat(calcDisplay.getText().toString())) {
        calcDisplay.setText(calcDisplay.getText().toString() + s);
    }
}

person jacknad    schedule 01.09.2010    source источник


Ответы (2)


Вы можете ограничить ввод символов в JTextField, добавив собственный KeyListener. Вот краткий пример для демонстрации идеи:

myTextField.addKeyListener(new KeyAdapter() {
  @Override
  public void keyTyped(KeyEvent e) {
    char c = e.getKeyChar();
    if (!Character.isDigit(c)) {
      e.consume(); // Stop the event from propagating.
    }
  }
});

Конечно, вам нужно учитывать специальные клавиши, такие как Delete, и комбинации, такие как CTRL-C, поэтому ваш KeyListener должен быть более сложным. Возможно, есть даже бесплатные утилиты, которые сделают за вас большую часть рутинной работы.

person maerics    schedule 01.09.2010
comment
Большая помощь. Спасибо большое. - person jacknad; 02.09.2010
comment
Предложение DocumentFilter — правильный путь. Это было добавлено в Swing в JDK4 и является предпочтительным подходом по сравнению с использованием KeyEvents. Ваш комментарий о CTRL-C — одна из причин, по которой фильтр лучше. - person camickr; 02.09.2010

Вы можете сделать это с помощью DocumentFilter.

Вот простой полный пример программы.

person Tom Hawtin - tackline    schedule 01.09.2010
comment
Том. Ссылку трудно читать как одну длинную неформатированную строку. - person jacknad; 02.09.2010
comment
Пытаетесь прочитать его как текстовый файл Windows? Я думаю, что WordPad справится с этим, а Блокнот — нет. Chrome в Windows показывает это правильно; IE нет. Я бы дал ссылку на запись в блоге, в которой это описывается, но я не могу найти ее в Google (вероятно, jroller ненадежный). - person Tom Hawtin - tackline; 02.09.2010