0

我的程序中有 getRuntime().exec() 调用;但是,其中两个不起作用:

public static final ROTCW = "xrandr -o left"
public static final CALCW1 = "xinput --set-prop 11 \"Evdev Axis Inversion\" 0 1"
public static final CALCW2 = "xinput --set-prop 11 \"Evdev Axes Swap\" 1";

public void actionPerformed(ActionEvent e)
{       
    try {
        Runtime.getRuntime().exec(ROTCW);
        Runtime.getRuntime().exec(CALCW1);
        Runtime.getRuntime().exec(CALCW2);}
    catch (IOException ioe){ ioe.printStackTrace();}
}});

ROTCW 确实有效(屏幕顺时针旋转),但它不校准(CALCW)。在与我启动程序的终端选项卡相同的终端选项卡中手动键入 CALCW不起作用,但将其键入新的终端选项卡/窗口确实有效。

为什么会发生这种情况,以及如何解决它?

4

3 回答 3

2

尝试添加一个外壳

 public static final CALCW = "bash -c 'xinput --set-prop 11 \"Evdev Axis Inversion\" 0 1" +
     " && xinput --set-prop 11 \"Evdev Axes Swap\" 1'"

要澄清&&的是shell的语法,只是程序的另一个参数。

于 2012-03-26T18:59:37.117 回答
2

您可以&&直接在 Java 中实现逻辑:

public static final String
    ROTCW = "xrandr -o left",
    CALCW1[] = {"xinput", "--set-prop", "11", "\"Evdev Axis Inversion\"", "0", "1"},
    CALCW2[] = {"xinput", "--set-prop", "11", "\"Evdev Axes Swap\"", "1"};

public void actionPerformed(ActionEvent e)
{       
    try {
        Runtime.getRuntime().exec(ROTCW).waitFor();
        Process p = Runtime.getRuntime().exec(CALCW1);
        p.waitFor();
        if( p.exitValue() != 0 ) Runtime.getRuntime().exec(CALCW2);
    }
    catch (IOException ioe){ ioe.printStackTrace();}
}});
于 2012-03-26T19:16:04.603 回答
0

这是一个老问题,但我没有找到答案,所以我要发布一个。

您必须在命令的正确部分使用 exec() 的数组版本并且不带引号:

CALCW1[] = {"xinput", "set-prop", "11", "Evdev Axis Inversion", "0", "1"}
于 2016-09-15T15:06:52.070 回答