PopupおよびPopupFactory

この変更に関連するバグ追跡レポート: 4303635

JPopupMenuJToolTipなどの一定の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);

Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.