在JavaFX阶段使用java.awt.Robot是否安全?

时间:2015-12-23 17:15:59

标签: java swing javafx

我在阶段init()方法中有以下代码,在窗口打开时按“SPACE”:

Platform.runLater(() -> {
    try {
        java.awt.Robot r = new java.awt.Robot();
        r.keyPress(java.awt.event.KeyEvent.VK_SPACE);
        r.keyRelease(java.awt.event.KeyEvent.VK_SPACE);
    } catch (Exception e) {
        e.printStackTrace();
    }
});

但是由于Robot属于java.awt包,并且知道JavaFX在与Swing / awt不同的线程中运行,我不知道这是否安全。 我所知道的是,它做了我想要的,但它会一直运作吗?我应该用其他东西替换这段代码吗?

2 个答案:

答案 0 :(得分:1)

是的,我在正常的线程中使用它(不使用Platform.runLater()),即使对于这样的UI事件它也能正常工作:

static Robot robot=null;

private void initialize(){
        Thread hilo=new Thread(new Runnable(){
            @Override
            public void run() {
                try {
                    robot=new Robot();
                    robot.waitForIdle();
                } catch (AWTException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }});

        hilo.start();
}

然后是事件方法

public static void handleMultiSelectIn(){
        try{
            if(togleMulti.isSelected())
                robot.keyPress(KeyEvent.VK_CONTROL);
            System.out.println("In:"+togleMulti.isSelected());
        }catch(Exception e){
            e.printStackTrace();
        }
    }

答案 1 :(得分:0)

JavaFX 8引入了一个SwingNode类,它提供了反向集成,并允许在JavaFX应用程序中嵌入Swing组件。
java.awt.Robot与Swing没有直接关系,但肯定会影响swing组件。

SwingNode类
要指定SwingNode对象的内容,请调用setContent方法,该方法接受javax.swing.JComponent类的实例。
您可以在JavaFX应用程序线程或事件派发线程(EDT)上调用setContent方法 但是,访问 Swing内容,请确保您的代码在EDT上运行,因为标准的Swing线程限制适用。

您可以在以下位置查看官方JavaFX文档:
Embedding Swing Content in JavaFX Applications