通过 a 在 Swing 窗口中嵌入菜单时JFXPanel
,我无法通过单击来关闭菜单。有时它会闪烁,好像它关闭并立即重新打开。
package testjavafx;
public class TestMenuJavaFX extends Application {
@Override
public void start(Stage primaryStage) {
MenuBar menuBar = new MenuBar(
new Menu("Menu 1", null,
new MenuItem("Menu item 1-1"),
new MenuItem("Menu item 1-2")),
new Menu("Menu 2", null,
new MenuItem("Menu item 2-1"),
new MenuItem("Menu item 2-2")),
new Menu("Menu 3", null,
new MenuItem("Menu item 3-1"),
new MenuItem("Menu item 3-1")));
menuBar.setPrefWidth(300);
Region root = new Pane(menuBar);
root.setPrefSize(300, 185);
useJFXPanel(root);
//usePrimaryStage(primaryStage, root);
}
private static void useJFXPanel(Region root) {
JFXPanel jfxPanel = new JFXPanel();
jfxPanel.setScene(new Scene(root));
JFrame jFrame = new JFrame("test menu JavaFX");
jFrame.setSize((int) root.getWidth(), (int) root.getHeight());
jFrame.add(jfxPanel);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setLocationRelativeTo(null);
jFrame.setVisible(true);
}
private static void usePrimaryStage(Stage primaryStage, Parent root) {
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
public static void main(String[] args) {
launch(TestMenuJavaFX.class, args);
}
}
通过使用该方法usePrimaryStage
,我得到了预期的行为(单击菜单将其打开,再次单击以将其关闭),但useJFXPanel
出现了问题。
这是一个事件处理问题,鼠标单击首先作为 Swing 鼠标事件分派到 JFXPanel,然后在JFXPanel
内部将 JavaFX 鼠标事件分派到其嵌入的Scene
.
看来,在 Swing 部分,菜单失去焦点并关闭,当事件到达 Menu 实例时,它发现它已关闭并因此打开它。
我尝试继承Menu
该类以向其添加鼠标单击事件处理程序,但是它不处理鼠标单击,并且使用提供的显示/显示和隐藏/隐藏事件无济于事(因为问题发生得更早)。
我还尝试子类MenuBar
化以添加鼠标单击事件处理程序,但是仅在单击菜单外的栏时才调用该处理程序,所以这里没有运气,并且子类化JFXPanel
以通过反射黑魔法覆盖processMouseEvent
和检索MenuBarButton
实例但我不能不要让它工作。
这是一个错误,对吧?是否有(简单而干净,理想情况下)解决此问题的方法?
我正在使用 OpenJDK 11.0.10.9 和 JavaFX 17.0.0.1。