Поле пароля iPhone в AWT / SWT? - PullRequest
4 голосов
/ 24 ноября 2010

Я хочу создать специальный диалог ввода пароля для моего продукта eclipse, который используется с экранной клавиатурой.

Было бы очень хорошо, если бы я мог использовать такой компонент, как поле IPhone Password. В этом поле добавленный символ отображается в течение секунды, а после второй он преобразуется в символ «*» для скрытия полного пароля.

Существовал ли jar / library, это реализовано в AWT или SWT?

Edit:

Я мог бы попытаться реализовать это с нуля (SWT), но для этого мне пришлось бы создать очень специальный и сложный KeyListener для компонента Text пароля. Мне нужно было бы перехватить событие keyReleased и вручную ввести символы в поле.

До сих пор я не смог найти никаких библиотек в сети. Предложение, как это можно реализовать, также приветствуется .

Ответы [ 2 ]

1 голос
/ 24 ноября 2010

В зависимости от того, что сказал Жюль, следующий код работает. Код быстрый и быстрый, и я хотел бы иметь более поточно-ориентированное решение.

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.

1 голос
/ 24 ноября 2010

Это на самом деле не полный ответ, а скорее дискуссия, и я не знаю ни одного готового виджета, который мог бы это сделать.

Моя первая идея состояла в том, чтобы унаследовать виджет SWT Text и переопределить setEchoChar и др., Но после просмотра кода это на самом деле не представляется возможным, потому что этот метод является просто оболочкой:

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

Если кто-то и знает низкоуровневую реализацию для конкретной ОС, это может быть полезно.

В любом случае, перейдем к другому подходу.Я бы избегал KeyListener и использовал бы ModifyListener в Text-Widget.

void addModifyListener(ModifyListener listener)

Затем вы могли бы создать оболочку, которая ловит введенный текст с помощью этого слушателя, добавляет его в локально хранящийся строку / строковый буфер (илинапример, хранилище настроек Eclipse) и отправьте измененный полный текст в виджет «Текст» с помощью setText (String s), заменив все символы, кроме последнего, символом эха (например, *).

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

Это немного клудж, но это должно сработать.

Не очень простой бит - это синхронизация в 1 секунду, без остановки всего вида ...

...