Сделать диалог JVM дочерним окном собственного окна верхнего уровня
У меня есть устаревшее приложение 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 ответ
Если вы используете XToolkit
(Java 1.7+), вы можете действовать следующим образом:
- Получить числовой идентификатор нативного пира
java.awt.Window
экземпляр (см. этот ответ). - Найдите соответствующий X11
Window
структурировать по его идентификатору путем итерации клиентов X-сервера (см. источникиxwininfo
а такжеxlsclients
коммунальные услуги, такжеSelect_Window_Args(int*, char**)
). - использование
XReparentWindow()
,