Переписать и вставить X-Window в дерево компонентов Java
Я должен переписать X-Window (из приложения C++) на фрейме Java (из Java-приложения). Это X-окно должно быть вставлено в дерево компонентов Java, чтобы z-порядок был уважаемым. Для этого мне нужно понять:
- Во-первых, точная связь между деревом компонентов, созданным приложением Java, и соответствующим деревом X-Window.
- Во-вторых, могу ли я и где я могу вставить X-Window в дерево Java благодаря reparent.
- В-третьих, способ обработки стека окна / компонента: какое окно / компонент будет располагаться поверх другого.
Несколько недель исследований... но я не нахожу ресурсов по этим вопросам...
По вопросу 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.
Надеюсь это поможет.