私はswingを使用して複数のjavafxを表示しTableview
、それぞれがswingに埋め込まれています(ありがとう JFXPanel
)TabbedPane
私は、oracle docで説明されているよく知られたパターンを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)
このコードは、ユーザーが新しいスイングタブを開くたびに実行されます(シーンの方法のみが異なります)が、この場合、これがスレッドを管理するための最良の方法であるかどうかはわかりません:-/
タブを閉じたり開いたりすると、アプリケーションに一貫性のない状態が発生し、表示中にエラーが発生します。
私のユースケースの例と、いくつかの質問がリンクされています:
最初のタブJ1を開くと、runlaterが呼び出され、シーンがタブに問題なく表示されます。
2番目のタブ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アプリケーションのメインスレッドは、スイングで異なるjfxpanelから到着したときに、この複数のrunlater()呼び出しをどのように管理しますか?
ユーザーがタブを閉じるときに、jfxpanelに関連付けられているリソースを(exit()Platformメソッドでメインのjavafxスレッドを閉じることなく)適切に閉じるにはどうすればよいですか?JFXPanelを破棄すると、表示に使用されるjavafxリソースが解放されますか?
タスクを使用してスレッドを管理することは、私の問題に対する答えになる可能性がありますか?
私の質問はおそらく素朴ですが、私はGUIの構築から始め、javafxがさまざまな埋め込みパネルのシーンを管理する方法を理解するのに問題があります。