Сделать диалог 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+), вы можете действовать следующим образом:

  1. Получить числовой идентификатор нативного пира java.awt.Window экземпляр (см. этот ответ).
  2. Найдите соответствующий X11 Window структурировать по его идентификатору путем итерации клиентов X-сервера (см. источники xwininfo а также xlsclients коммунальные услуги, также Select_Window_Args(int*, char**)).
  3. использование XReparentWindow(),
Другие вопросы по тегам