2017-09-25 41 views
1

我有一个传统的X/Motif C++应用程序,使用Java/JNI为其添加了新窗口。使JVM对话框成为原生顶级窗口的子窗口

新的Java窗口既可以是顶层窗口也可以是没有父窗口的对话框。

是否有任何合理的方法来获取由JVM创建的子窗口,如JDialog,其父窗口使用X/Motif在本地创建,如果是,那么该怎么做?即使Java AWT/Swing没有意识到父母结构,并且窗口管理器只是将对话框保留在顶层窗口之上,这仍然很有用(当然,对Java中的所有窗口进行正常控制将更可取,对于我的问题的所有用途而言并非严格必要)。

我在想,答案可能是“不,没有任何合理的方式,你必须在你的本地和JVM内部进行史诗般的手术。”如果那是答案,那就这样吧。但我希望有人可以按照“如果您进行此X调用或窗口管理器调用,您可以让窗口管理器提供某些对话框属性,并将参数顶级窗口作为父级”。

本质上,我期望尽可能地增加C++和Java用户界面之间的集成。现在,它们通过使用JNI作为一个应用程序运行,但GUI窗口/组件基本上是分开的,尽管共享数据。

已经提到的一个好处是没有在用户认为是顶级窗口后面显示对话框。

我已经考虑过的另一件事,虽然我可能不会这么做(告诉我你觉得它有多疯狂),是通过获取组件的屏幕坐标来使它看起来好像Java组件在C++窗口中一样C++方面,在该屏幕位置的Java端显示无边框窗口,因此它看起来像是C++应用程序的一部分。但是,我可以想到这么多的负面影响,除非有一种简单的方法否定它们(焦点问题,在这个虚拟窗口和真正的顶层窗口之间显示的窗口,以及其他东西会影响用户体验)。尽管如此,尽管如此,仍然有利于我的问题得到肯定的回答。

+0

您定位哪个_Java_版本?你使用的是哪个_AWT_工具包 - 是“MToolkit”还是“XToolkit”?基本上你想要实现的就像是一个自定义的_AWT Toolkit_实现(你可以从_OpenJDK_中获取XToolkit,并根据你的需要进行调整)。 – Bass

回答

0

如果您正在使用XToolkit(Java 1.7+),你可以进行如下操作:

  1. 得到一个java.awt.Window实例的本地同行的数字ID(见this answer)。
  2. 通过迭代X服务器的客户端(请参阅xwininfoxlsclients实用程序的源代码,还有Select_Window_Args(int*, char**)),通过其id找到相应的X11 Window结构。
  3. 使用XReparentWindow()
相关问题