Числа фильтра Java от num pad в JTextArea - PullRequest
0 голосов
/ 27 февраля 2019

Код клавиши для номера 1 в Java 49, а код клавиши для номера 1 из цифровой клавиатуры - 97. У меня есть JTextArea, и мне нужно предотвратить вставку чисел из цифровой клавиатуры.

Я пытался:

  • с использованием DocumentFilter, но здесь я не получаю код ключа

  • с использованием ActionMap, здесь я могу сопоставить код ключа, но яне может предотвратить его добавление в текст JTextArea

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

Позднее редактирование: при использовании ActionMap я не могу удалить последний символ, потому что "actionPerformed" выполняется перед добавлениемсимвол для JTextArea.Я попробовал это:

JTextArea jtf1 = new JTextArea();   
jtf1.getActionMap().put("handleReplaceable", new AbstractAction() {
    @Override
    public void actionPerformed(java.awt.event.ActionEvent e) {
        System.err.println("Found replaceable original text is "+jtf1.getText());
        jtf1.setText(jtf1.getText().substring(0, jtf1.getText().length()-1));
    }
});

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Вы можете сделать это, используя метод JTextArea#setEditable(false), когда клавиша numpad имеет значение pressed, а затем JTextArea#setEditable(true), когда клавиша numpad отпущена.

Пример:

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;

public class IgnoreNumpad {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            final JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            JTextArea area = new JTextArea();
            area.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD1, 0, false), "disable");
            area.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD2, 0, false), "disable");
            area.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD1, 0, true), "enable");
            area.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD2, 0, true), "enable");
            //Add all keys
            area.getActionMap().put("disable", new AbstractAction() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    area.setEditable(false); //When key pressed, set it non-editable
                }
            });
            area.getActionMap().put("enable", new AbstractAction() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    area.setEditable(true); //Key released, make it editable
                }
            });
            frame.add(area);

            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}
0 голосов
/ 27 февраля 2019

Вы можете преобразовать вашу строку в вашем textArea в массив байтов.После этого с помощью цикла for вы должны знать, есть ли число в вашей текстовой области.Кодовые номера начинаются с 48 (для номера ноль) и заканчиваются на 57 (номер 9)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...