使 JVM 对话框成为本机顶级 window 的子 window

Make JVM dialog a child window of native top-level window

我有一个旧版 X/Motif,C++ 应用程序已使用 Java/JNI 添加了新的 windows。

新 Java windows 要么是顶级 windows 要么是没有父级的对话。

是否有任何合理的方法让 JVM 创建的子 window(例如 JDialog)具有在本机端使用 [=28= 创建的 window 作为其父级],如果是那么怎么办?即使 Java AWT/Swing 不知道父结构并且 window 经理只是将对话框保持在顶层 window(的当然,在 Java 中对 windows 进行所有正常控制会更好,只是对于我的问题的所有用途来说并不是绝对必要的。

我想答案可能是"No, not in any reasonable way. You would have to do epic surgery on both your native side and within the JVM."如果这是答案,那就这样吧。但我希望有人能按照 "If you make this X call or that window manager call, you can get the window manager to supply certain dialog properties with the argument top-level window as the parent."

的方式给出答案

本质上,我希望尽可能增加 C++ 和 Java 用户界面之间的集成。现在,它们 运行 作为一个使用 JNI 的应用程序,但 GUI windows/components 本质上是独立的,尽管共享数据。

已经提到的这样做的一个好处是,对话框不会显示在用户认为是顶层的内容后面 window。

我考虑过的另一件事,虽然我可能不会做(告诉我你认为它有多疯狂),是让它看起来好像 Java 组件在 C++ window 中通过获取 C++ 端组件的屏幕坐标,在该屏幕位置的 Java 端显示无边框 window,因此它看起来像是 C++ 应用程序的一部分。不过,我能想到这么多负面影响,除非有一种简单的方法来消除它们,否则我不会这样做(焦点问题,一个 window 显示在这个虚拟 window 和真正的顶级window,其他的东西会影响用户体验)。不过,即使避免这种情况,对我的问题做出肯定回答仍然有好处。

如果您使用的是 XToolkit (Java 1.7+),您可以按以下步骤操作:

  1. 获取 java.awt.Window 实例的本机对等点的数字 ID(请参阅 this answer)。
  2. 通过迭代 X 服务器的客户端,通过其 ID 找到相应的 X11 Window 结构(参见 xwininfoxlsclients 实用程序的来源,以及 Select_Window_Args(int*, char**) ).
  3. 使用XReparentWindow().