1

Swing のJLayeredPaneについて何かを理解しようとしています。誰かがこのクラスを使用したことがある場合は、フィードバックをいただければ幸いです。

getLayer(JComponent c) のドキュメントには次のように記載されています。

JComponent のレイヤ プロパティを取得します。setLayer() のような副作用はありません。(ペイント、追加/削除など) 通常は、インスタンス メソッド getLayer() を使用する必要があります。

これはインスタンス メソッド getLayer() であるため、明らかに間違いがあります (オーバーロードされたバージョンはありません)。

ここで行うべき別の呼び出しが実際にあるのでしょうか、それとも putLayer() からのコピーに熱心すぎる人がいたのでしょうか。

JComponent にレイヤ プロパティを設定します。このメソッドは、setLayer() のような副作用 (ペイント、追加/削除など) を引き起こしません。通常、必要な副作用 (再描画など) を得るには、インスタンス メソッド setLayer() を使用する必要があります。

4

1 に答える 1

2

Swing の多くのものと同様に、あなたの質問に対する答えは、swing のソース コードに示されています。JLayeredPane.java から:

public static int getLayer(JComponent c) {
    Integer i;
    if((i = (Integer)c.getClientProperty(LAYER_PROPERTY)) != null)
        return i.intValue();
    return DEFAULT_LAYER.intValue();
}

public int getLayer(Component c) {
    Integer i;
    if(c instanceof JComponent)
        i = (Integer)((JComponent)c).getClientProperty(LAYER_PROPERTY);
    else
        i = (Integer)getComponentToLayer().get((Component)c);

    if(i == null)
        return DEFAULT_LAYER.intValue();
    return i.intValue();
}

ここでいくつかの違いが見られるのは、JComponent インスタンスのレイヤーが JComponent インスタンスのプロパティとして格納されているのに対し、Component インスタンスのレイヤーは JLayeredPane のハッシュテーブル内に格納されているためのようです。したがって、getLayer(JComponent c) は静的にできますが、getLayer(Component c) はできません。

ご想像のとおり、これはこのクラスの奇妙さの始まりにすぎません。JLayeredPane とコンテンツの検証と描画は、すぐに複雑になる可能性があります。

于 2009-02-10T16:22:06.093 に答える