2015-12-23 16 views
1

我有一個階段init()方法中下面的代碼,按「SPACE」的窗口打開時:在JavaFX階段使用java.awt.Robot是否安全?

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(); 
    } 
}); 

但作爲機器人屬於java.awt包,並且知道JavaFX的在不同的線程中運行比Swing/awt,我不知道這是否安全。 我所知道的是它做我想要的,但它會一直工作嗎?我應該用其他的東西代替這個代碼嗎?

回答

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(); 
     } 
    } 
0

JavaFX 8引入了一個SwingNode類,該類提供了反向集成,並允許在JavaFX應用程序中嵌入Swing組件。
java.awt.Robot與Swing沒有直接關係,但肯定會影響揮杆組件。

SwingNode類
要指定SwingNode對象的內容,調用setContent方法,該方法接受javax.swing.JComponent中類的一個實例。
您可以在JavaFX應用程序線程或事件分派線程(EDT)上調用setContent方法。
但是,要訪問的Swing內容,請確保您的代碼在EDT上運行,因爲標準的Swing線程限制適用。
Embedding Swing Content in JavaFX Applications

您可以查看官方的JavaFX在文檔

相關問題