2012-11-28 53 views
0

我想创建一个虚拟的数字键盘,所以,当我按下ü我得到,产生,Ø产生,依此类推:如何重新映射某些键?

789   789 
uio becomes 456 
jkl   123 
m    0 

但我需要键盘的其余部分继续照常工作。我试过this和一些其他的解决方案,但它们对我没用,因为在我的JTextField上,我得到了4U5I6O(或U4I5O6,这取决于我实现的解决方案)。

我需要摆脱这封信,并只产生数字。

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

谢谢。

+0

你的键盘事件处理程序不能单独输出你的信件,并且对它们采取行动,就像数字被按下一样? – Miquel

回答

3

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

由于DocumentFilter示例,请参见:

+0

我尝试了建议的解决方案,但过滤器中的方法从不被调用,因此,我在我的文本中获得了原始字母。 – ilvidel

+1

@ilvidel你用'setDocumentFilter()'设置过滤器吗? –

+1

@ilvidel如果您尝试过,请在您的问题中发布SSCCE。这种方法应该可行,所以很可能你做错了什么 – Robin

1

这是@ Eng.Fouad的建议的eample(请,所有信贷给他)。

基本上,这将用随机字符替换所有输入到文本字段的文本。

我不难更新代码以提供映射的更改(例如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); 
      } 

     } 

    } 

}