2009-06-26 4 views
0

背景情報:Swing:JInternalFrameをコンテナ内の他のコンポーネントに等しく扱うにはどうすればよいですか?

私はと

  • 異なるシンプル(タイトルバー、サブ要素で再かなり、)

    • 異なる複雑な要素から構成され、ビジュアルダイアグラムエディタを実装しています要素(サイズ変更不可、タイトルバーなし、サブ要素なし)。

    すべての要素はドラッグ可能です。

    JPanel (単純要素の場合)と一緒にJInternalFrame(複雑な要素の場合)を使用して回路図の要素を表しています。 これらの要素をすべて含むコンテナ(JDesktopPaneまたはJLayeredPaneのいずれか)があります。

    ケース1 - コンテナがJDesktopPaneのである:

    私はこの概念にはいくつかの問題を抱えている

    • のJInternalFrameは、他の要素の上に常にあります。
    • 他の要素をクリックすると、以前のアクティブなJInternalFrame

    ケース2 "無効化" していない - コンテナがのJLayeredPaneである:

    • JInternalFrameの内部のいくつかの要素をクリックした後、それがままに は「有効」になります。

    ケース3 - JInternalFrameがすべてのために使用されるが、単純な要素のための装飾なし:

    • (私は手動で JInternalFrameのタイトルバーを削除する際に必要とされている)私のカスタムボーダーです現在のLAF境界に置き換えられたたびに、 のJInternalFrameをアクティブ化/非アクティブ化した後。

    とにかくJInternalFramesをアクティブにするという概念全体がわかりません。私はJInternalFrameがすべてで活性化しない作ることができれば 、私は ケース選ぶことができる2任意の幸せになります。

    問題を特定するための簡単でわかりやすい解決策を教えてください。

    注:コンポーネントの選択とJInternalFrame のアクティブ化は、異なるものと思われます。

  • 答えて

    0

    私はあなたの問題を誤解する可能性があります。 JIFのsetSelected()メソッドを見てみましたか?メソッドオーバーライドと拒否可能なアクティベーションイベントのサポートがあるようです。

    編集:今、私はあなたの第二のケースを再読み込み

    /** 
    * Selects or deselects the internal frame 
    * if it's showing. 
    * A <code>JInternalFrame</code> normally draws its title bar 
    * differently if it is 
    * the selected frame, which indicates to the user that this 
    * internal frame has the focus. 
    * When this method changes the state of the internal frame 
    * from deselected to selected, it fires an 
    * <code>InternalFrameEvent.INTERNAL_FRAME_ACTIVATED</code> event. 
    * If the change is from selected to deselected, 
    * an <code>InternalFrameEvent.INTERNAL_FRAME_DEACTIVATED</code> event 
    * is fired. 
    * 
    * @param selected a boolean, where <code>true</code> means this internal frame 
    *     should become selected (currently active) 
    *     and <code>false</code> means it should become deselected 
    * @exception PropertyVetoException when the attempt to set the 
    *   property is vetoed by the <code>JInternalFrame</code> 
    * 
    * @see #isShowing 
    * @see InternalFrameEvent#INTERNAL_FRAME_ACTIVATED 
    * @see InternalFrameEvent#INTERNAL_FRAME_DEACTIVATED 
    * 
    * @beaninfo 
    *  constrained: true 
    *   bound: true 
    *  description: Indicates whether this internal frame is currently 
    *     the active frame. 
    */ 
    

    編集2:はたぶん私たちはjavadocの状態など、いくつかの用語の誤解を持っています。私は、それぞれのJIFが独自の焦点/選択環境を持っていると言います。すべてのJIFをトラバースするメソッドを作成し、そのコンポーネントを選択しない限り、その中のすべての選択を解除することができます。それだけでなく、プロパティの変更のために火をするsetSelectedで、あなたのJInternalFrameの初期化時に

    +0

    はい、問題ありません。選択はJInternalFrameのアクティブ化とは関係ありません。 –

    +0

    Javadocでさえ混乱しています。彼らは選択について話しますが、プロパティは "活性化"という名前です。注:「選択された」プロパティもあります(これは私の問題には当てはまりません)。うーん、私は混乱している... –

    +0

    私はそれを取得しないでください。今ではInternalFrameListenerとFocusListenerをすべてのJIFに追加しましたが、これらのリスナーの中にはイベントがありません! –

    0

    =試しJInternalFrame.setSelected(boolean)にコードを見ること

    new JInternalFrame(<your args>) { 
          protected void fireInternalFrameEvent(int id){ 
           if (id != InternalFrameEvent.INTERNAL_FRAME_ACTIVATED) { 
            super.fireInternalFrameEvent(id); 
           } 
          } 
    }; 
    

    メモして、これを与える、するsetSelectedと「actvationは」プロセスで一緒に結び付けられています選択だけでなく、fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_ACTIVATED)も呼び出します。

    関連する問題