重新显示并将X-Window插入Java组件树

时间:2012-12-04 15:02:44

标签: swing jframe x11 reparenting

我必须在Java框架(来自Java应用程序)上重新显示X-Window(来自C ++应用程序)。必须在Java组件树中插入此X-Window,以便尊重z-Order。要做到这一点,我需要理解:

  1. 首先,创建的组件树之间的确切关系 Java应用程序和匹配的X-Window树。
  2. 其次,我是否可以在Java上插入X-Window 树由于重新表现。
  3. 第三,处理窗口/组件堆栈的方式:哪个窗口/组件将位于另一个窗口/组件之上。
  4. 几周的研究......但我没有找到关于这些问题的任何资源......

    关于问题1 。据我所知,如果我创建一个带有组件和另外两个框架的java主框架,Swing树应该是这样的:

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

    关于X-Window树:aach 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树的关系。

1 个答案:

答案 0 :(得分: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对象比使用z-order的Frame1中的任何东西更接近观察者但是它与Frame1重叠,那么它并不重要。 XWindow订购将获胜,并且将绘制来自Frame1的Swing组件。

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

希望这有帮助。