使JVM对话框成为本机顶级窗口

时间:2017-09-25 20:08:29

标签: swing user-interface java-native-interface xserver motif

我有一个遗留的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 ++应用程序的一部分。我可以想到这么多的负面影响,但我不会这样做,除非有一种简单的方法来否定它们(焦点问题,在这个虚拟窗口和真正的顶层窗口之间显示的窗口,以及其他东西会影响用户体验)。尽管如此,即使避免这种情况,对我的问题的肯定答案仍然有好处。

1 个答案:

答案 0 :(得分:0)

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

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