Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在同一线程中使用SWT shell和JavaFx阶段?_Javafx_Swt - Fatal编程技术网

如何在同一线程中使用SWT shell和JavaFx阶段?

如何在同一线程中使用SWT shell和JavaFx阶段?,javafx,swt,Javafx,Swt,我有一个带有javafxstage和swtshell的应用程序。javafxstage中有一些控件可以更改Shell中SWT小部件的属性,还有一些JaveFX控件可以通知SWT小部件中的更改。 当然,使用JavaFX的一切都必须在JavaFX应用程序线程中发生,而使用SWT小部件的一切都必须在SWT线程中发生 我第一次尝试为每个线程设置一个线程,并在切换上下文时切换线程。这很烦人,我决定不再采用这种方法。 而是在JavaFX应用程序线程内创建SWT窗口,以便两个UI在同一线程上运行。除一件事外,

我有一个带有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这是一个问题的解决方案,你会接受答案吗?完成了。我是个新手,所以我没有意识到接受答案。