Windowlicker не работает на OS X

1

У меня проблема с windowlicker на OS X (все работает нормально в Windows). Проблема в том, что когда я пытаюсь имитировать пользовательский ввод в любое текстовое поле, данные не вставлены должным образом (некоторые буквы вырезаны).

Например:

JTextFieldDriver txField = new JTextFieldDriver(this, 
                                                JTextField.class, 
                                                named(fieldName));
txField.focusWithMouse();
txField.typeText(input);

Предшествующий код приведет к тому, что я буду наблюдать ввод вставки окна в текстовое поле с именем fieldName, и вход будет неполным (Peter будет Peer или Fred будет Fre и т.д.). Все работает нормально на окнах.

Я не уверен, что все это имеет какое-либо отношение к предупреждению. Я получаю похожие на окна. Предупреждение: "ВНИМАНИЕ: не удалось загрузить раскладку клавиатуры Mac-, используя резервный макет с ограниченными возможностями (JAR entry com/objogate/wl/keyboard/Mac- не найден в /Users/odo/.m2/repository/com/googlecode/windowlicker/windowlicker-core/r268/windowlicker-core-r268.jar)"

Теги:
macos
swing

1 ответ

2

Windowlicker, похоже, не очень популярный инструмент. Тем не менее мне удалось выяснить причину. Предупреждение о том, что раскладка клавиатуры не может быть установлена, отображается, потому что я не использую английский язык. Похоже, что windowlicker поддерживает только раскладку клавиатуры Mac-GB. Предупреждение исчезнет, если будет установлено соответствующее системное свойство. Например:

System.setProperty("com.objogate.wl.keyboard", "Mac-GB");

Однако это не решит основной проблемы. После нескольких испытаний я понял, что только символы "a" и "d" обрезаны. Это связано с тем, что windowlicker вставляет их, как если бы пользователь немного удерживал клавишу "a" или "d". Удержание этих клавиш приводит к вызову вспомогательного меню, которое позволяет выбирать специальные символы. Чтобы исправить это, я играл с JTextComponentDriver и нашел обходное решение. Решение не использовать драйвер typeText для вставки текста. Метод JTextComponentDriver component() может использоваться для извлечения фактического компонента парня, а затем для вызова текста можно вызвать экземпляр setText().

Ниже представлен мой вспомогательный класс, который использует описанное решение:

public class TextTyper {
    private final String inputText;

    privte TextTyper(String inputText) {
        this.inputText = inputText;
    }

    public static TextTyper typeText( final String inputText ){
        return new TextTyper( inputText );
    }

    public void into( JTextComponentDriver<?> driver ) throws Exception{
        driver.focusWithMouse();
        driver.clearText();

        Component cmp = driver.component().component();
        if(cmp instanceof JPasswordField ){
            JPasswordField pwField = (JPasswordField) cmp;
            pwField.setText(this.inputText);
        }
        else if( cmp instanceof JTextField){
            JTextField txField = (JTextField) cmp;
            txField.setText(this.inputText);
        }

        else
            throw new Exception("Component is not an instance of JTextField or JPasswordField");
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню