2017-09-25 69 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()