0

仮想テンキーを作成したいので、Uを押すと4が表示され、5生成され、O6が生成されます。

789            789
uio   becomes  456  
jkl            123
m              0

しかし、いつものように動作し続けるには、キーボードの残りの部分が必要です。私はこれと他のいくつかの解決策を試しまし4U5I6Oたが、JTextFieldで(またはU4I5O6実装する解決策によっては)得られるので、それらは私には役に立ちません。

私は手紙を取り除き、数字だけを作成する必要があります。

誰かが適切な解決策を知っていますか?

ありがとう。

4

2 に答える 2

3

に直接入力する場合はJTextField、を使用することをお勧めしますDocumentFilter

の例としてDocumentFilter、以下を参照してください。

于 2012-11-28T19:28:46.927 に答える
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);
            }

        }

    }

}
于 2012-11-29T00:16:49.953 に答える