Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > фильтрация вводимых знаков keyPressed


Автор: tavla 5.5.2013, 01:03
привет.

нужно запретить в JTextPane ввод знаков '(апостроф) и "(кавычка). использую для этого keyPressed, но все-равно проскальзывают. помогите с кодом, пожалуйста.

Автор: dorogoyIV 5.5.2013, 03:11
keyReleased

Автор: Mirkes 5.5.2013, 16:06
Я с этим тоже сталкивался. Почему keyPressed и buttonPressed (mouse), работают коряво, а вот keyReleased 
 и buttonReleased работают нормально?

Автор: tavla 5.5.2013, 21:13
как я понимаю, очередность событий такая:
1 - KeyPressed для каждой из нажатых клавишь (если shift+ символ - значит два события KeyPressed).
2 - KeyTyped для символа, который получился на предыдущих шагах.
3 - KeyReleased для каждой из нажатых клавишь.

например, для маленькой а:
- KeyPressed для "а".
- KeyTyped для "а".
- KeyReleased для "а".

для заглавной А (shift+a):
- KeyPressed для shift.
- KeyPressed для "а".
- KeyTyped для "А".
- KeyReleased для "а".
- KeyReleased для shift.

по идее, чтобы не заморачиваться с раскладкой клавиатуры и не перехватывать шифты, проще обрабатывать введенный символ в KeyTyped.

запустил в дебагере пример, в котором все маленькие n должны заменяться на m, т.е. следующая последовательность событий:
- KeyPressed для "n".
- KeyTyped для "n".
- KeyReleased для "n". 

пытаюсь заменить "n" на "m" на каждом шаге:
Код

        textPane = new JTextPane();
        textPane.addKeyListener(new KeyListener() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_N)
                    e.setKeyCode(KeyEvent.VK_M);
                System.out.println(e.getKeyChar());
                System.out.println(KeyEvent.getKeyText(e.getKeyCode()));
            }

            @Override
            public void keyTyped(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_N)
                    e.setKeyCode(KeyEvent.VK_M);
                System.out.println(e.getKeyChar());
                System.out.println(KeyEvent.getKeyText(e.getKeyCode()));
            }

            @Override
            public void keyReleased(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_N)
                    e.setKeyCode(KeyEvent.VK_M);
                System.out.println(e.getKeyChar());
                System.out.println(KeyEvent.getKeyText(e.getKeyCode()));
            }
        });


результат:
1. в KeyPressed "n" перехватывается, срабатывает условие и e.setKeyCode(KeyEvent.VK_M)
System.out.println - n
System.out.println - M

2. в KeyTyped условие if (e.getKeyCode() == KeyEvent.VK_N) не выполняется
System.out.println - n
System.out.println - Unknown keyCode: 0x0

3. в KeyReleased опять срабатывает условие if (e.getKeyCode() == KeyEvent.VK_N) и e.setKeyCode(KeyEvent.VK_M)
System.out.println - n
System.out.println - M

в textPane печатается "n". почему так? невозможно вмешаться в основной поток ввода?

Автор: tavla 5.5.2013, 22:55
решено:

замена n на m
Код

            @Override
            public void keyTyped(KeyEvent e) {
                if (e.getKeyChar() == 'n') 
                    e.setKeyChar('m');
            }

запрет ввода n
Код

            @Override
            public void keyTyped(KeyEvent e) {
                if (e.getKeyChar() == 'n') 
                    e.consume();
            }

Автор: leskar 9.8.2013, 14:22
По-моему правильнее использовать свой документ. Вот пример:

http://www.java2s.com/Tutorial/Java/0260__Swing-Event/CustomDocumentFilter.htm

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)