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);