我正在使用 swing 显示多个 javafx Tableview
,每个都嵌入(感谢 JFXPanel
)在一个 swingTabbedPane
我以scala方式使用oracle doc中描述的众所周知的模式:
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)
每次用户打开新的摆动选项卡时都会执行此代码(只有场景方法不同),但我不确定这是在这种情况下管理线程的最佳方法:-/
当我关闭或打开选项卡时,我的应用程序中有一些不连贯的状态,并且在显示期间出现错误。
我的用例的一个例子,以及一些链接的问题:
我打开第一个选项卡 J1,调用 runlater,我的场景在选项卡中显示没有问题。
我打开第二个选项卡 J2,在 javafx 线程上调用一个新的 runlater,
我切换到标签 J1,我的标签中的显示如何刷新?向主线程启动隐式
runnable
操作以使这成为可能?javafx如何识别刷新的好标签?如果我有一个启动某些动作的按钮,我会runlater()
在 javafx 主线程上启动一个动作,该线程调度?
更新:
我找到了一个可以帮助读者了解这一点的代码源,您可以revalidate()
或/和repaint()
您的摆动面板(此处_contentpane
)包含您的jfxPanel
SwingUtilities.invokeLater(new Runnable() {
public void run() {
_contentPane.add(_jfxPanel);
_contentPane.revalidate();
_contentPane.repaint(); }});
- 我关闭第一个选项卡 J1,javafx 自动关闭/垃圾关联的 javafx 资源?
我有多个其他一般性问题:
当 javafx 应用程序主线程从 swing 中的不同 jfxpanel 到达时,它们如何管理这个多个 runlater() 调用?
当用户关闭选项卡时,如何正确关闭与我的 jfxpanel 关联的资源(不使用 exit() Platform 方法关闭主 javafx 线程)?如果我销毁 JFXPanel,用于显示的 javafx 资源是否被释放?
使用任务来管理我的线程可以解决我的问题吗?
我的问题可能很幼稚,但我从 gui 构建开始,我很难理解 javafx 如何在不同的嵌入式面板上管理场景。