Как игнорировать событие нажатия клавиши в Swing? - PullRequest
3 голосов
/ 29 ноября 2011

Я хочу, чтобы текстовое поле принимало от пользователя только цифровую кнопку и клавишу возврата.

Я добавил функцию, которая используется для проверки кода клавиши у пользователя, но я не знаю, как остановить событие нажатия клавиши, если код клавиши не числовой.

Какой код мне нужно добавить в функцию, чтобы остановить событие ??

 private void jTextField2KeyPressed(java.awt.event.KeyEvent evt)   
 {                                       

   if(!((evt.getKeyCode()==8) || (evt.getKeyCode()>48 && evt.getKeyCode()<57)))
   {
      //how to stop the key pressed event
   }
 }

Ответы [ 6 ]

7 голосов
/ 29 ноября 2011

Вам не нужно возиться с обработкой событий Swing, чтобы достичь этого.

Лучше всего использовать вместо этого JFormattedTextField.

Подробнее см. В руководстве по Java:

http://docs.oracle.com/javase/tutorial/uiswing/components/formattedtextfield.html

4 голосов
/ 29 ноября 2011

Попробуйте переопределить keyTyped:

@Override
public void keyTyped(KeyEvent evt) {
    if (!Character.isDigit(evt.getKeyChar()) && !(evt.getKeyCode() == KeyEvent.VK_BACK_SPACE)) {
        evt.consume();
    }
}

Обновление:

Если вы хотите, чтобы вставка не работала и вводился ввод, вы можете использовать следующее.

@Override
public void keyPressed(KeyEvent evt) {
    if(evt.isControlDown() && evt.getKeyCode() == KeyEvent.VK_V) {
        evt.consume();
    }
}
2 голосов
/ 29 ноября 2011

установить DocumentFilter PlainDocument текстового поля.
Пример:

    PlainDocument document = new PlainDocument();
    document.setDocumentFilter(new DocumentFilter() {

        @Override
        public void insertString(FilterBypass fb, int offset, String text, AttributeSet attrs) throws BadLocationException {
            fb.insertString(offset, filter(text), attrs);
        }

        @Override
        public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
            fb.replace(offset, length, filter(text), attrs);
        }

        private String filter(String text) {
            StringBuilder builder = new StringBuilder(text);
            for (int i = 0; i < builder.length();) {
                if (Character.isDigit(builder.charAt(i))) {
                    i += 1;
                } else {
                    builder.deleteCharAt(i);
                }
            }
            return builder.toString();
        }
    });

    JTextField field = new JTextField(document, null, 0);
0 голосов
/ 15 августа 2018

Вы можете попробовать это:

    private void txtDisplayKeyTyped(java.awt.event.KeyEvent evt) {                                          


    boolean valid = false; //some condition here
    if(!valid) evt.consume();
}
0 голосов
/ 03 августа 2014

Я бы посоветовал вам посмотреть, можете ли вы использовать события keyPressed, KeyReleased и KeyTyped, и посмотреть, не позволяют ли они достичь ключа вашей программы.

Ваша программа, вероятно, ищет только один тип ключевого события, но вам нужно выяснить, какое это событие, и использовать эти события.

0 голосов
/ 29 ноября 2011

См. Ограничить ввод TextField числовым значением - я думаю, это именно то, что вы ищете.

Я думаю, что причина, по которой ваш код не работает, заключается в том, что оператор if неверени на самом деле не поймать не числовые коды клавиш.Хотя я не уверен, потому что я сам не видел и не тестировал ваш код, чтобы вы могли отладить его, если вы действительно этого хотите, но, честно говоря, опубликованные здесь решения будут самыми простыми.

...