PopupおよびPopupFactoryJPopupMenuやJToolTipなどの一定のComponentは、特定の包含関係の階層内で自らをほかのすべてのComponentの上に配置します。 これらのComponentは、それぞれが同じコードを含んで同じ動作を取得するのではなく、PopupFactoryから取得できるPopupへ動作を委譲します。 Popupは、画面上の特定の位置でComponentを表示することができます。 要求されたComponentのサイズと位置に基づいて、PopupFactoryは適切なPopupを返します。
以前は、PopupおよびPopupFactoryが非公開でパッケージされていました。 JDK 1.4では、これらのクラスを公開し、カスタム・ルック・アンド・フィールを実装することにより、独自のPopupを作成できるようにしました。 これで、ほかのルック・アンド・フィールも、それぞれ適切な方法でメニューを配置できるようになります。 そのために以下のクラスを公開しました。
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を取得しますが、カスタム・ルック・アンド・フィールの実装でこれをオーバーライドし、希望するどのような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);