我使用swing来显示多个javafx Tableview
,每个JFXPanel
都嵌入在swing TabbedPane
中(感谢JFXPanel
)
我使用oracle文档中描述的众所周知的模式( scala ):
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选项卡(只有场景方法不同)时,都会执行这段代码,但我不确定这是管理线程的最好方法-/
当我关闭或打开一个选项卡时,我的应用程序中有一些非相干状态,并且在显示过程中出现了错误。
我的用例示例,以及一些相关的问题:
runnable
操作被启动到主线程以使这成为可能?如何识别javafx刷新的好选项卡?如果我有一个启动某些动作的按钮,我会在javafx主线程上启动一个runlater()
动作,这个线程是哪个分派的?更新:
我找到一个代码源代码,可以在这一点上帮助读者,您可以revalidate()
或/和repaint()
您的swing面板(此处为_contentpane
),其中包含您的jfxPanel
。
SwingUtilities.invokeLater(new Runnable() {
public void run() {
_contentPane.add(_jfxPanel);
_contentPane.revalidate();
_contentPane.repaint(); }});
我还有很多其他一般性问题:
我的问题可能很幼稚,但我从gui大楼开始,我很难理解javafx如何在不同的嵌入式面板上管理场景。
发布于 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代码来说明这个概念:
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构建过程--否则,在集成过程中可能会遇到太多的陷阱和陷阱,很少有人能够帮助您解决这些问题。
https://stackoverflow.com/questions/14448162
复制相似问题