0

Java フレーム (Java アプリから) で X-Window (C++ アプリから) の親を変更する必要があります。この X-Window は、z-Order が尊重されるように、Java コンポーネント ツリー内に挿入する必要があります。そのためには、次のことを理解する必要があります。

  1. まず、Java アプリケーションによって作成されたコンポーネント ツリーと、対応する X-Window ツリーとの正確な関係。
  2. 第二に、reparent のおかげで Java ツリーに X-Window を挿入できるかどうか、およびどこに挿入できるか。
  3. 第 3 に、ウィンドウ/コンポーネント スタックの処理方法: どのウィンドウ/コンポーネントが別のウィンドウの上にあるのか。

数週間の調査...しかし、これらの質問に関するリソースは見つかりません...

質問について 1.私が理解している限り、コンポーネントと他の 2 つのフレームを含む Java メイン フレームを作成すると、Swing ツリーは次のようになります。

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

X-Window ツリーについて: 各フレームは重いコンポーネントなので、各フレームには X-Window ID があります。したがって、X-Window ツリーは次のようになります。

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

質問について 2.私の質問は、Swing ツリーの他のコンポーネントの真ん中にアプレット (つまり重量コンポーネント) を挿入するとどうなるかということです。X-window はどのように見えるでしょうか? この方法で、Java アプリケーションの X-Window の親を変更でき、この X-Window が Java ツリーに挿入されることを願っています。

質問について 3.X-Window を再親化/Java アプリケーションに挿入できたとしても、z オーダーが尊重されるかどうかはわかりません。実際に試してみたところ、Java Frame のすべてのコンポーネントの上に X-Window が表示されました。ウィンドウ/コンポーネント スタックの処理方法と、Java および X-Window ツリーとの関係がよくわかりません。

4

1 に答える 1

1

正直な開示-私がこの種のことをしてから少なくとも12年が経ちました。したがって、これを「価値があるもののために」と考えてください。

まず、ツリー内のすべてのSwingオブジェクトには、Swingコンポーネントツリーの上位にある重量のあるコンテナがあります。これは、最も外側のフレームであってもです。Swingオブジェクトは、そのXWindowの表面上の単なる論理的な描画領域です。

質問1: Frame1とFrame2がFrame0内に埋め込まれている場合、最初のケースでのあなたの答えは正しいです。それ以外の場合、それらは独立したXWindowsです。

質問2:新しいヘビーウェイトコンポーネントをSwingツリーに挿入すると、新しいコンポーネントは、追加されたSwingコンポーネントの描画面を含むXWindowの新しいXWindowコンポーネントの子として追加されます。これは私の記憶が最も曖昧な答えの一部です。

質問3:(問題の本質)。XWindowシステムは、最初に各ポイントで表示されるXWindowウィンドウを決定します。次に、各XWindow内で、ただしXWindows全体ではなく、Swingはその領域に対応するSwingサブツリーを描画します。より正確には、Javaは、対応するXWindowキャンバス上の各ヘビーウェイトコンポーネントのSwingサブツリーを描画します。次に、XWindowサーバーは、XWindowツリーのみに基づいて、これらのキャンバスのどの部分が各ポイントで表示されるかを決定します。

したがって、Zオーダーを使用してFrame1のどのオブジェクトよりもビューアに近いFrame0にSwingオブジェクトがあるが、Frame1とオーバーラップしている場合、それは重要ではありません。XWindowの順序が優先され、Frame1のSwingコンポーネントが描画されます。

注-これを理解すると、Swingオブジェクトの「ハード」クリッピングを提供するために使用できます。

お役に立てれば。

于 2012-12-14T02:46:13.667 に答える