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