首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将多个嵌入式javafx JFXPanel管理到swing表窗格中

将多个嵌入式javafx JFXPanel管理到swing表窗格中
EN

Stack Overflow用户
提问于 2013-01-21 22:11:02
回答 1查看 2K关注 0票数 2

我使用swing来显示多个javafx Tableview,每个JFXPanel都嵌入在swing TabbedPane中(感谢JFXPanel)

我使用oracle文档中描述的众所周知的模式( scala ):

代码语言:javascript
运行
复制
implicit def fun2Run[T](x: ⇒ T) = new Runnable {
    def run = x
  }

  def myTabbedScene():Scene = {
    val root = new StackPane
    root.getChildren.add(new Label("Hello world!"))
    new Scene(root, 300, 300)
  }

  def initFxPanel(fxPanel: JFXPanel, s: ⇒ Scene) = {
    fxPanel.setScene(s)
  }

  def initSwingGui(panel: PluginPanel) = {
    val fxPanel = new JFXPanel()
   // code to add panel to JPanel
    panel.peer.add(fxPanel)
    Platform runLater initFxPanel(fxPanel,myTabbedScene())
  }

  val jfxSwingPanel = new PluginPanel("wrap 2") {
    var jtemp = new JPanel()
    contents += jtemp
  }

  SwingUtilities invokeLater initSwingGui(jfxSwingPanel)

每次用户打开一个新的swing选项卡(只有场景方法不同)时,都会执行这段代码,但我不确定这是管理线程的最好方法-/

当我关闭或打开一个选项卡时,我的应用程序中有一些非相干状态,并且在显示过程中出现了错误。

我的用例示例,以及一些相关的问题:

  • 我打开第一个选项卡J1,一个运行程序被调用,我的场景显示在标签中没有问题。
  • 我打开第二个选项卡J2,在javafx上调用一个新运行程序,
  • 我切换到选项卡J1,我的选项卡中的显示是如何刷新的?一个隐式runnable操作被启动到主线程以使这成为可能?如何识别javafx刷新的好选项卡?如果我有一个启动某些动作的按钮,我会在javafx主线程上启动一个runlater()动作,这个线程是哪个分派的?

更新:

我找到一个代码源代码,可以在这一点上帮助读者,您可以revalidate()或/和repaint()您的swing面板(此处为_contentpane),其中包含您的jfxPanel

代码语言:javascript
运行
复制
   SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
    _contentPane.add(_jfxPanel); 
    _contentPane.revalidate(); 
    _contentPane.repaint(); }});
  • 我关闭了第一个选项卡J1,javafx自动关闭/垃圾相关的javafx资源?

我还有很多其他一般性问题:

  • javafx应用程序主线程在从不同的jfxpanel在swing中到达时如何管理这个多个runlater()调用?
  • 当用户关闭选项卡时,如何正确关闭与jfxpanel关联的资源(没有关闭主javafx线程和exit() Platform方法)?如果我破坏了JFXPanel,用于显示的javafx资源是否被解放了?
  • 使用任务来管理我的线程可以回答我的问题?

我的问题可能很幼稚,但我从gui大楼开始,我很难理解javafx如何在不同的嵌入式面板上管理场景。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-21 22:28:33

javafx应用程序线程在从不同的jfxpanel在swing中到达时如何管理这个多个runlater()调用?

来自Platform.runLater javadoc:

在未来某个未指定的时间在JavaFX应用程序线程上运行指定的可运行程序。该方法可以从任何线程调用,它将把Runnable发送到事件队列,然后立即返回给调用者。运行程序按照发布的顺序执行。传入runLater方法的runnable将在任何Runnable传递到随后对runLater的调用之前执行。

此外:

当用户关闭选项卡时,如何正确关闭执行jfxpanel的线程(没有关闭主javafx线程)?

不清楚你指的是哪条线。通常,在集成JavaFX和Swing时,只需要关注两个线程-- Swing调度线程和JavaFX应用程序线程--这两个线程都应该由各自的底层框架来管理,并且不需要显式关闭。您不需要任何其他线程,除非您试图做一些不应该在其中任何一个线程上执行的事情(例如高度CPU密集型任务或远程I/O) --从您的示例代码来看,情况似乎并非如此。

使用任务来管理我的线程可以回答我的问题?

除非你对这样的事情有明确的需求,否则这样的解决方案可能会使你的处境更加复杂,而不是改善它。

我关闭了第一个选项卡J1,javafx自动关闭/垃圾相关的javafx资源?

如果您没有在相关的jfxpanel中保留对任何资源的引用,那么Java虚拟机就可以垃圾收集jfxpanel和与其相关的资源--这只是标准的Java垃圾收集技术,这里没有什么特别的。

我切换到选项卡J1,我的选项卡中的显示是如何刷新的?一个隐式可运行操作被启动到主线程以使这成为可能?

听起来是个坏主意( Java术语中的主要线程是用来启动Java主要功能的线程,根本不涉及GUI编程)。您可能希望通过Platform.runLater()提交可运行的刷新请求,以便在JavaFX应用程序线程上执行该请求。

javafx如何识别要刷新的好选项卡?

每个swing选项卡中都有一个JavaFX JFXPanel,每个swing选项卡都知道它有哪个JFXPanel,所以当调用Platform.runLater刷新特定面板时,向要使用的JFXPanel传递一个(最终)引用。这里有一些完全没有语言的psuedo代码来说明这个概念:

代码语言:javascript
运行
复制
on swing tab change event
  final JFXPanel curPanel = tab.getJFXPanel()
  Platform.runLater() {
    // update curPanel here...
  }

如果我有一个启动某些操作的按钮,那么我将在javafx主线程上启动一个runlater()操作,这个线程是哪个分派的呢?

本质上,我认为您在这里是正确的,我将重写您的问题来澄清一些术语--假设它是一个swing按钮,在执行swing按钮上的操作时,您调用Platform.runLater,那么runLater调用中的代码最终将在JavaFX应用程序线程上执行。

其他问题我无法回答,因为我在Scala方面不够流利,无法提供一个合理的答案。

老实说,如果您刚刚开始构建GUI,那么我不请自来的建议是使用Java而不是Scala,坚持使用Swing或JavaFX,但不要将它们混合在一起,直到您真正适应GUI构建过程--否则,在集成过程中可能会遇到太多的陷阱和陷阱,很少有人能够帮助您解决这些问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14448162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档