Как я могу переназначить определенные клавиши?

Я хочу создать виртуальную цифровую клавиатуру, чтобы при нажатии U я получал 4, I выдавал 5. strong>, O дает 6 и так далее:

789            789
uio   becomes  456  
jkl            123
m              0

Но мне нужно, чтобы остальная часть клавиатуры продолжала работать как обычно. Я пробовал это и некоторые другие решения, но они мне бесполезны, потому что в моем JTextField я получаю 4U5I6O (или U4I5O6 в зависимости от того, какое решение я реализую).

Мне нужно избавиться от буквы и указать только число.

Кто-нибудь знает правильное решение?

Спасибо.


person ilvidel    schedule 28.11.2012    source источник
comment
Разве ваш обработчик событий клавиатуры не может выделить ваши буквы и действовать на них так, как если бы число было нажато?   -  person Miquel    schedule 28.11.2012


Ответы (2)


Если вы вводите данные непосредственно в JTextField, тогда я рекомендую использовать DocumentFilter .

Например, DocumentFilter: видеть:

person Eng.Fouad    schedule 28.11.2012
comment
Я попробовал предложенное решение, но методы в фильтре никогда не вызываются, и поэтому я получаю исходные буквы в своем тексте. - person ilvidel; 29.11.2012
comment
@ilvidel Вы установили фильтр с помощью setDocumentFilter()? - person Eng.Fouad; 29.11.2012
comment
@ilvidel Если вы пробовали это, опубликуйте SSCCE этого в своем вопросе. Такой подход должен сработать, так что скорее всего вы что-то делаете не так - person Robin; 29.11.2012
comment
@Eng.Fouad (и Робин) Хорошо, я явно делал что-то не так. Я использовал setDocumentFilter(), но я, должно быть, пропустил что-то еще. Сегодня на свежую голову все переделал, и получилось. Спасибо! - person ilvidel; 29.11.2012

Это пример предложения @Eng.Fouad (пожалуйста, отдайте ему должное).

По сути, это заменит весь текст, введенный в текстовое поле, случайным символом.

Мне было бы несложно обновить код для доставки сопоставленных изменений (например, a = 1) или даже процесса шифрования.

public class TestPhasicDocumentFilter {

    public static void main(String[] args) {
        new TestPhasicDocumentFilter();
    }

    public TestPhasicDocumentFilter() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new PhasicPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class PhasicPane extends JPanel {

        public PhasicPane() {

            setLayout(new GridBagLayout());
            JTextField field = new JTextField(12);
            add(field);

            ((AbstractDocument)field.getDocument()).setDocumentFilter(new PhasicDocumentFilter());

        }

        public class PhasicDocumentFilter extends DocumentFilter {
            protected String phasic(String text) {

                StringBuilder sb = new StringBuilder(text);
                for (int index = 0; index < sb.length(); index++) {
                    sb.setCharAt(index, (char)(33 + (int)Math.round(Math.random() * 93)));
                }

                return sb.toString();
            }

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

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

        }

    }

}
person MadProgrammer    schedule 29.11.2012