代码之家  ›  专栏  ›  技术社区  ›  Markus Lausberg

AWT/SWT中的IPhone密码字段?

  •  4
  • Markus Lausberg  · 技术社区  · 14 年前

    我想为我的eclipse产品创建一个特殊的密码对话框,它与屏幕键盘一起使用。

    如果我能使用IPhone密码字段这样的组件,那就太好了。在此字段中,所添加的字符将显示一秒钟,然后将其转换为“*”字符以隐藏完整密码。

    是否存在jar /库,这是在AWT或SWT中实现的?

    编辑:

    我可以尝试从头开始实现它(SWT),但对于这些,我必须为password文本组件创建一个非常特殊和复杂的keylister。我必须捕捉keyReleased事件并将字符手动设置到字段中。

    到目前为止,我在网上找不到任何图书馆。 我们也欢迎提出如何实施的建议 .

    2 回复  |  直到 14 年前
        1
  •  1
  •   Jules    14 年前

    这并不是一个完整的答案,而是一个讨论的开始,我不知道有什么现成的小部件可以做到这一点。

    我的第一个想法是继承swt文本小部件并重写setEchoChar等,但在查看代码之后,这似乎并不真正可行,因为此方法只是一个包装:

    OS.SendMessage (handle, OS.EM_SETPASSWORDCHAR, echo, 0);
    

    如果有人知道操作系统特定的低级实现,那可能会有帮助。

    无论如何,换一种方式。我会避开keylister并在文本小部件上使用ModifyListener。

    void addModifyListener(ModifyListener listener)
    

    然后,您可以构建一个包装器,使用此侦听器捕获输入的文本,将其附加到本地保存的string/stringbuffer(或例如Eclipse Preferencestore)中,并使用setText(string s)将修改后的全文发送到文本小部件,将除最后一个字符以外的所有字符替换为echo字符(例如*)。

    myText.setText((s.substring(0, s.length()-1)).replaceAll("[\\s\\S]","*")+s.charAt(s.length()-1));
    

    这有点古怪,但应该行得通。

    不那么直接的一点是1秒计时,没有拖延整个视图。。。

        2
  •  1
  •   Markus Lausberg    14 年前

    根据朱尔斯的说法,下面的代码是某种工作。 代码是快速的,我想有一个更线程安全的解决方案。

    originalString = new StringBuffer();
    
    passwordField.addModifyListener(new ModifyListener() {
    
    public void modifyText(ModifyEvent e) {
    
        synchronized (passwordField) {
    
             String s = passwordField.getText();
    
             String newS = s.replaceAll("[\\s\\S]", "*");
             if (newS.equals(s)) {
                 while (originalString.length() > s.length()) {
                     originalString = originalString.deleteCharAt(originalString.length() - 1);
                 }
                 usernameField.setText(originalString.toString());
                 return;
             }
    
            if (originalString.length() < s.length()) {
                originalString.append(s.charAt(s.length() - 1));
            }
    
            try {
                Thread.sleep(500);
            } catch (InterruptedException e1) {
            }
            passwordField.setText(newS);
        }
    
        passwordField.redraw();
    
        passwordField.setSelection(passwordField.getText().length());
        }
    
    });
    

    键事件被缓存,因此您可以添加更多字符,也可以在线程等待时添加。 另一个问题是光标处理。设置文本时,光标始终移动到第一个位置。

    我认为,当这是工作时,它是非常接近iphone的解决方案。