У меня проблема с 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)"
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");
}
}