Переписать и вставить X-Window в дерево компонентов Java

Я должен переписать X-Window (из приложения C++) на фрейме Java (из Java-приложения). Это X-окно должно быть вставлено в дерево компонентов Java, чтобы z-порядок был уважаемым. Для этого мне нужно понять:

  1. Во-первых, точная связь между деревом компонентов, созданным приложением Java, и соответствующим деревом X-Window.
  2. Во-вторых, могу ли я и где я могу вставить X-Window в дерево Java благодаря reparent.
  3. В-третьих, способ обработки стека окна / компонента: какое окно / компонент будет располагаться поверх другого.

Несколько недель исследований... но я не нахожу ресурсов по этим вопросам...

По вопросу 1. Насколько я понимаю, если я создаю основной фрейм Java с компонентами и двумя другими фреймами, дерево Swing должно выглядеть так:

                                Frame0
                                   :
                                   :-------------------------------
                                   :               :              :
                               Component         Frame1         Frame2
                                   :
                     Component-----------Component

О дереве X-Window: aach Frame является компонентом Heavy-Weight, поэтому у каждого Frame есть идентификатор X-Window. Таким образом, дерево X-Window может выглядеть так:

                                Frame0
                                   :
                         Frame1---------Frame2

По вопросу 2. Мой вопрос: что произойдет, если я вставлю апплет (то есть компонент Heavy-Weight) в середине дерева Swing среди других компонентов? Как будет выглядеть окно X? Я надеюсь, что таким образом я смогу переопределить X-Window в Java-приложении и что это X-Window будет вставлено в дерево Java.

По вопросу 3. Даже если я смогу переопределить / вставить X-Window в Java-приложение, я не уверен, что z-порядок будет соблюдаться. На самом деле я сделал пробную версию, и X-Window появился поверх всех компонентов Java Frame. Я не уверен, чтобы понять, как обрабатывается стек окна / компонента и его отношения с деревьями Java и X-Window.

1 ответ

Решение

Честное раскрытие - прошло не менее двенадцати лет с тех пор, как я делал подобные вещи. Поэтому воспринимайте это как "то, чего оно стоит".

Во-первых, у каждого объекта Swing в дереве есть тяжеловесный контейнер выше в дереве компонентов Swing - даже если это только самый внешний фрейм. Объекты Swing - это просто логические области рисования на поверхности этого XWindow.

Вопрос 1: Ваш ответ в первом случае правильный, если Frame1 и Frame2 встроены в Frame0. В противном случае они являются независимыми XWindows.

Вопрос 2: Когда вы вставляете новый тяжеловесный компонент в дерево Swing, ваш новый компонент будет добавлен как новый дочерний компонент XWindow XWindow, содержащий поверхность рисования компонента Swing, к которому он добавлен. Это часть ответа, в которой моя память наиболее размыта.

Вопрос 3: (суть вопроса). Система XWindow сначала решает, какие окна XWindow видны в каждой точке. Затем в каждом XWindow, но не в XWindows, Swing рисует соответствующее поддерево Swing в этой области. Точнее, Java рисует поддерево Swing для каждого тяжелого компонента на соответствующем холсте XWindow. Затем сервер XWindow определяет, какая часть этих полотен видна в каждой точке, основываясь только на дереве XWindow.

Итак, если у вас есть какой-либо объект Swing в Frame0, который ближе к зрителю, чем что-либо в Frame1, использующее z-порядок, но перекрывающийся с Frame1, ЭТО НЕ имеет значения. Порядок XWindow победит, и компоненты Swing из Frame1 будут нарисованы.

Примечание. Как только вы поймете это, вы сможете использовать его для "жесткого" отсечения объектов Swing.

Надеюсь это поможет.

Другие вопросы по тегам