通过使用WEmbeddedFrame类,可以轻松地将Java Swing窗口集成到C++应用程序(在Windows上)中:
// (1)
SwingUtilities.invokeLater(() -> {
try {
WEmbeddedFrame meinJFrame = new WEmbeddedFrame(hwndParentFromCppApplication);
meinJFrame.add(... panel ...);
...
meinJFrame.setVisible(true);
}
catch (...) {}
});
这似乎可以顺利工作,即使父HWND来自不同的进程。(这是因为Java工程师能够玩弄电锯:http://blogs.msdn.com/b/oldnewthing/archive/2013/04/12/10410454.aspx :-)
据我所知,为了将JavaFX Stage放入本地父窗口中,只有通过将JFXPanel对象包装到Swing WEmbeddedFrame中间接地实现。
// (2)
Platform.runLater(() -> {
try {
WEmbeddedFrame frame = new WEmbeddedFrame(hwndParentFromCppApplication);
final JFXPanel fxPanel = new JFXPanel();
frame.add(fxPanel);
frame.setVisible(true);
Scene scene = ...
fxPanel.setScene(scene);
frame.show();
} catch (...) {}
});
但是这种解决方案有两个严重的缺点:
当鼠标在场景上移动时,场景会闪烁。
在父窗口移动后,组合框项目和菜单项目被放置在错误的位置。
我还尝试将舞台放入一个AppletWindow中:
// (3)
Stage fxstage = new Stage();
fxstage.initStyle(StageStyle.UNDECORATED);
fxstage.setScene(scene);
AppletWindow appw = tk.createAppletWindow(hwndParentFromCppApplication, "");
appw.setStageOnTop(fxstage);
appw.setPosition(0, 0);
appw.setSize(100, 100);
appw.setVisible(true);
// fxstage.show();
这只显示一个黑色矩形。如果我取消注释fxstage.show(),则舞台将作为顶级窗口打开 - 而不是在小程序内部。
在JavaFX源代码中,我找到了com.sun.javafx.stage.EmbeddedWindow类。这听起来很有前途,但我该如何使用它?或者说,我该如何构建所需的HostInterface实现?
您知道如何将JavaFX舞台放入Windows C++窗口吗?
非常感谢!
问候 沃尔夫冈