我在阶段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不同的线程中运行,我不知道这是否安全。 我所知道的是,它做了我想要的,但它会一直运作吗?我应该用其他东西替换这段代码吗?
答案 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