Windowlicker无法在OS X上运行

时间:2014-04-26 20:57:05

标签: java macos swing

我在OS X上遇到了windowlicker的问题(在Windows上一切正常)。 问题是,当我尝试模拟任何文本字段的用户输入时,数据未正确插入(某些字母被删除)。

例如:

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

前面的代码将导致我将观察windowslighter插入输入到名为 fieldName 的文本字段,输入将不完整(Peter将是Peer或Fred将是Fre等等)。一切都在Windows上正常工作。

我不确定是否所有与警告有关。我在Windows上得到类似的东西。警告是: “警告:无法加载键盘布局Mac-,使用具有降低功能的后备布局(JAR条目com / objogate / wl / keyboard / Mac-未在/Users/odo/.m2/repository/com/googlecode/windowlicker/windowlicker中找到-core / r268 / windowlicker核-r268.jar)“

1 个答案:

答案 0 :(得分:2)

Windowlighter似乎不是非常受欢迎的工具。然而,我设法找出根本原因。显示键盘布局无法设置的警告因为我没有使用英语语言环境而显示。它看起来像windowlicker只支持Mac-GB键盘布局。 如果设置了适当的系统属性,警告将消失。 例如:

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

然而,这不会解决主要问题。经过几次试验,我发现只有' a'并且' d'字符被修剪。这是因为windowlicker会插入它们,就好像用户会按住“a'或者' d'关键一点。按住这些键会导致辅助菜单调用,允许选择特殊字符。为了解决我使用JTextComponentDriver并找到解决方法的问题。解决方案不是使用驱动程序的typeText来插入文本。 JTextComponentDriver的component()方法可用于检索实际的guy组件,然后可以调用实例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");
    }
}