0

我必须在 Java 框架(来自 Java 应用程序)上重新设置 X-Window(来自 C++ 应用程序)。这个 X-Window 必须插入到 Java 组件树中,这样 z-Order 才会得到尊重。为此,我需要了解:

  1. 首先,Java 应用程序创建的组件树与匹配的 X-Window 树之间的确切关系。
  2. 其次,由于reparent,我是否可以在Java树上插入X-Window以及在何处插入。
  3. 第三,处理窗口/组件堆栈的方式:哪个窗口/组件将在另一个之上。

几周的研究......但我没有找到关于这些问题的任何资源......

关于问题 1。据我了解,如果我创建一个带有组件和其他两个框架的 java 主框架,则 Swing 树应该如下所示:

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

关于 X-Window 树:每个 Frame 都是一个重量级组件,因此每个 Frame 都有一个 X-Window ID。所以 X-Window 树可能看起来像这样:

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

关于问题 2。我的问题是:如果我在 Swing 树的中间插入一个 Applet(所以是一个重量级组件)以及其他组件会发生什么?X 窗口会是什么样子?我希望通过这种方式,我可以在 Java 应用程序上重新创建一个 X-Window,并且这个 X-Window 将被插入到 Java 树中。

关于问题 3。即使我可以将 X-Window 重新设置为 / 插入到 Java 应用程序中,我也不确定是否会尊重 z 顺序。事实上,我做了一个试验,X-Window 已经出现在 Java Frame 的所有组件之上。我不确定了解窗口/组件堆栈的处理方式及其与 java 和 X-Window 树的关系。

4

1 回答 1

1

诚实披露——我做这种事情至少已经十二年了。因此,将其视为“物有所值”。

首先,树中的每个 Swing 对象在 Swing 组件树的上层都有一个重量级容器——即使它只是最外层的框架。Swing 对象只是 XWindow 表面上的逻辑绘图区域。

问题 1:如果 Frame1 和 Frame2 嵌入在 Frame0 中,您在第一种情况下的答案是正确的。否则它们是独立的 XWindows。

问题 2:当您在 Swing 树中插入一个新的重量级组件时,您的新组件将作为 XWindow 的新 XWindow 组件子级添加,其中包含它所添加到的 Swing 组件的绘图表面。这是我记忆最模糊的部分答案。

问题3:(问题的实质)。XWindow 系统首先决定在每个点上哪些 XWindow 窗口是可见的。然后,在每个 XWindow 内,而不是跨 XWindows,Swing 在该区域中绘制相应的 Swing 子树。更准确地说,Java 在匹配的 XWindow 画布上为每个重量级组件绘制 Swing 子树。然后,XWindow 服务器仅根据 XWindow 树确定这些画布的哪些部分在每个点上是可见的。

因此,如果您在 Frame0 中有一些 Swing 对象,它比 Frame1 中使用 z 顺序的任何东西都更靠近查看器,但它与 Frame1 重叠,则无关紧要。XWindow 排序将获胜,并且将绘制 Frame1 中的 Swing 组件。

注意 - 一旦你理解了这一点,你就可以使用它来提供 Swing 对象的“硬”剪辑。

希望这可以帮助。

于 2012-12-14T02:46:13.667 回答