Popup および PopupFactory

この変更に対応するバグ追跡レポートは、 4303635 です。

JPopupMenuJToolTip などの一定の Component は、特定の包含関係の階層内で自らをほかのすべての Component の上に配置します。 これらの Component は、それぞれが同じコードを含んで同じ動作を取得するのではなく、PopupFactory から取得できる Popup へ動作を委譲します。 Popup は、画面上の特定の位置で Component を表示することができます。 要求された Component のサイズと位置に基づいて、PopupFactory は適切な Popup を返します。

以前は、Popup および PopupFactory が非公開でパッケージされていました。 JDK 1.4 では、これらのクラスを公開して、カスタム Look & Feel の実装で独自の Popup を作成できるようにしました。 これで、ほかの Look & Feel も、それぞれ適切な方法でメニューを配置できるようになります。 そのために以下のクラスを公開しました。

public class PopupFactory {
    public static void setSharedInstance(PopupFactory factory);
    public static PopupFactory getSharedInstance();
    public Popup getPopup(Component owner, Component contents, int x, int y) throws IllegalArgumentException;
    }
    
public class Popup {
    protected Popup(Component owner, Component contents, int x, int y);
    protected Popup();
    public void show();
    public void hide();
    }

JPopupMenu に使用される Popup が UI で置き換えられるように、以下が PopupMenuUI に追加されました。

    public Popup getPopup(JPopupMenu popup, int x, int y);
    

PopupMenuUI.getPopup の実装は共有 PopupFactory から Popup を取得しますが、カスタム Look & Feel の実装でこれをオーバーライドし、希望するどのような Popup でも返すことができます。

セマンティクスの変更

JPopupMenu では以前、setLocation メソッドを定義しました。 このリリース以前は、このメソッドが Popup 上で setLocation を呼び出しましたが、このメソッドが Popup から削除されたので、JPopupMenu では現在のところ、Popup を作成し直します。

JPopupMenu は、setPopupSize メソッドも定義しました。 このメソッドは、表示可能であれば Popup 上で setSize を呼び出しました。 内部的には、このメソッドを変更して JPopupMenu の希望サイズを設定するようにしましたが、同じ結果になります。 これが呼び出されるときに JPopupMenu が表示可能であれば、Popup が再作成されます。 JPopupMenu の javadoc は、次の新しい動作を反映するように変更されました。

    public void setPopupSize(Dimension d);

    public void setPopupSize(int width, int height);