如何重新映射某些键?

时间:2012-11-28 19:19:23

标签: java swing keyboard jtextfield documentfilter

我想创建一个虚拟数字键盘,这样当我按 U 时,我得到 4 会产生 5 O 产生 6 ,依此类推:

789            789
uio   becomes  456  
jkl            123
m              0

但我需要键盘的其余部分继续像往常一样工作。我尝试了this和其他一些解决方案,但它们对我没用,因为在我的JTextField上我得到 4U5I6O (或 U4I5O6 < / strong>取决于我实施的解决方案。

我需要摆脱这封信,只生成这个数字。

有人知道一个合适的解决方案吗?

感谢。

2 个答案:

答案 0 :(得分:3)

如果您直接输入JTextField,我建议您使用DocumentFilter

作为DocumentFilter的示例,请参阅:

答案 1 :(得分:1)

这是@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);
            }

        }

    }

}