如何在同一线程中使用SWT shell和JavaFx阶段?
我有一个带有javafxstage和swtshell的应用程序。javafxstage中有一些控件可以更改Shell中SWT小部件的属性,还有一些JaveFX控件可以通知SWT小部件中的更改。 当然,使用JavaFX的一切都必须在JavaFX应用程序线程中发生,而使用SWT小部件的一切都必须在SWT线程中发生 我第一次尝试为每个线程设置一个线程,并在切换上下文时切换线程。这很烦人,我决定不再采用这种方法。 而是在JavaFX应用程序线程内创建SWT窗口,以便两个UI在同一线程上运行。除一件事外,一切都是这样运作的如何在同一线程中使用SWT shell和JavaFx阶段?,javafx,swt,Javafx,Swt,我有一个带有javafxstage和swtshell的应用程序。javafxstage中有一些控件可以更改Shell中SWT小部件的属性,还有一些JaveFX控件可以通知SWT小部件中的更改。 当然,使用JavaFX的一切都必须在JavaFX应用程序线程中发生,而使用SWT小部件的一切都必须在SWT线程中发生 我第一次尝试为每个线程设置一个线程,并在切换上下文时切换线程。这很烦人,我决定不再采用这种方法。 而是在JavaFX应用程序线程内创建SWT窗口,以便两个UI在同一线程上运行。除一件事外,
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
SWT需要这个代码段,否则非窗口小部件会对事件做出反应,SWT也需要它像其他任何东西一样位于同一个线程上。但是这个代码段是阻塞的,所以我一使用它JavaFX就会冻结
我知道使用SWT和JavaFXWindows可能是一个非常奇怪的用例,但有解决方案吗
我想澄清一下:
- 我不想在SWT小部件中使用JavaFX节点
- 我不想在JavaFX节点中使用SWT小部件
- SWT和JavaFX可以在同一线程中运行。实现这一点的一个小技巧是在调用任何其他JavaFX代码之前创建一个伪FXCanvas实例。FXCanvas通常用于将FX控件嵌入SWT;即使您不需要,FXCanvas构造函数也会正确初始化JavaFX以在SWT互操作性模式下工作
下面的代码片段演示了一个SWT shell和一个JavaFX阶段的协同工作。SWT和JavaFX按钮点击处理程序都在JavaFX应用程序线程上执行
publicstaticvoidmain(字符串[]args){
Display=Display.getDefault();
新的FXCanvas(newshell(),SWT.NONE);
阶段primaryStage=新阶段();
按钮fxbutton=新按钮(“JavaFX按钮”);
场景=新场景(fxbutton);
fxbutton.addEventHandler(单击MouseEvent.MOUSE,MouseEvent->System.out.println(“FX事件,thread=“+thread.currentThread().getName()));
初级阶段。场景(场景);
primaryStage.show();
外壳=新外壳(显示,SWT.CLOSE);
setLayout(新的FillLayout());
org.eclipse.swt.widgets.Button swtbutton=new org.eclipse.swt.widgets.Button(shell,swt.PUSH);
setText(“SWT按钮”);
addListener(SWT.Selection,event->System.out.println(“SWT-event,thread=“+thread.currentThread().getName()));
shell.open();
shell.pack();
而(!shell.isDisposed()){
如果(!display.readAndDispatch())
display.sleep();
}
}
SWT和JavaFX可以在同一个线程中运行。实现这一点的一个小技巧是在调用任何其他JavaFX代码之前创建一个伪FXCanvas实例。FXCanvas通常用于将FX控件嵌入SWT;即使您不需要,FXCanvas构造函数也会正确初始化JavaFX以在SWT互操作性模式下工作
下面的代码片段演示了一个SWT shell和一个JavaFX阶段的协同工作。SWT和JavaFX按钮点击处理程序都在JavaFX应用程序线程上执行
publicstaticvoidmain(字符串[]args){
Display=Display.getDefault();
新的FXCanvas(newshell(),SWT.NONE);
阶段primaryStage=新阶段();
按钮fxbutton=新按钮(“JavaFX按钮”);
场景=新场景(fxbutton);
fxbutton.addEventHandler(单击MouseEvent.MOUSE,MouseEvent->System.out.println(“FX事件,thread=“+thread.currentThread().getName()));
初级阶段。场景(场景);
primaryStage.show();
外壳=新外壳(显示,SWT.CLOSE);
setLayout(新的FillLayout());
org.eclipse.swt.widgets.Button swtbutton=new org.eclipse.swt.widgets.Button(shell,swt.PUSH);
setText(“SWT按钮”);
addListener(SWT.Selection,event->System.out.println(“SWT-event,thread=“+thread.currentThread().getName()));
shell.open();
shell.pack();
而(!shell.isDisposed()){
如果(!display.readAndDispatch())
display.sleep();
}
}
我怀疑很多人对JavaFX和SWT的了解是否足够,是否可以肯定,但我认为这可能是不可能的。请注意,在macOS上,SWT还需要在第一个线程上运行,这使得这一点变得更加困难。我怀疑许多人对JavaFX和SWT都了解得足够多,可以肯定地说,但我认为这可能是不可能的。请注意,在macOS上,SWT还需要在第一个线程上运行,这使得这变得更加困难。由于我要求一个解决方案,我已经切换到另一个实现,但我会记住您的解决方案。thxAs这是一个问题的解决方案,你会接受答案吗?完成了。我是个新手,所以我不知道接受答案。这很有效。由于我要求一个解决方案,我已经切换到另一个实现,但我会记住您的解决方案。thxAs这是一个问题的解决方案,你会接受答案吗?完成了。我是个新手,所以我没有意识到接受答案。