我有一个遗留的 X/Motif C++ 应用程序,它使用 Java/JNI 添加了新窗口。
新的 Java 窗口要么是顶级窗口,要么是没有父级的对话框。
是否有任何合理的方法可以让 JVM 创建的子窗口(例如 JDialog)具有使用 X/Motif 在本机端创建的窗口作为其父窗口,如果是,那么如何?即使 Java AWT/Swing 不知道父级结构并且窗口管理器只是将对话框保持在顶级窗口的顶部,这仍然很有用(当然,最好在 Java 中对窗口进行所有正常控制,只是我的问题的所有用途都不是绝对必要的)。
我认为答案可能是“不,不是以任何合理的方式。你必须在你的本地和 JVM 内进行史诗般的手术。” 如果这是答案,那就这样吧。但我希望有人能回答“如果您进行此 X 调用或该窗口管理器调用,您可以让窗口管理器提供某些对话框属性,并将参数顶级窗口作为父级。”
本质上,我希望尽可能多地增加 C++ 和 Java 用户界面之间的集成。现在,它们通过使用 JNI 作为一个应用程序运行,但 GUI 窗口/组件本质上是独立的,尽管共享数据。
已经提到的这样做的一个好处是,对话框不会显示在用户认为是顶级窗口的后面。
我考虑过的另一件事,虽然我可能不会做(告诉我你认为它有多疯狂),是通过在 C++ 端获取组件的屏幕坐标,让它看起来好像 Java 组件在 C++ 窗口中,在该屏幕位置的 Java 端显示一个无边框窗口,因此它看起来像是 C++ 应用程序的一部分。但是,我可以想到很多负面影响,除非有一种简单的方法来否定它们,否则我不会这样做(焦点问题,在这个虚拟窗口和真正的顶层窗口之间显示一个窗口,以及其他事情会影响用户体验)。但是,即使避免这种情况,对我的问题做出肯定回答仍然有好处。