Popup
& PopupFactory
Certain Component
s, such as JPopupMenu
and JToolTip
, present themselves
above all other Component
s in a particular
containment hierarchy. Rather than each of these
Component
s containing the same code to obtain the
same behavior, they delegate
to a Popup
which can be obtained from a
PopupFactory
. A Popup
is able to
display a Component
at a particular location on the
screen. Based on the size and location of the requested
Component
, PopupFactory
returns an
appropriate Popup
.
Previously, Popup
and
PopupFactory
were package private. For JDK 1.4,
we have exposed these classes to enable
custom look and feel implementations to create their
own Popup
s. This allows other look and feels
to position menus
in an appropriate manner for their look and feel.
To this end, we have made these classes public:
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(); }
To enable the Popup
used by JPopupMenu
to be replaced by the UI, we added the following to
PopupMenuUI
:
public Popup getPopup(JPopupMenu popup, int x, int y);
PopupMenuUI.getPopup
's implementation obtains
the Popup
from the shared
PopupFactory
, but custom look and feel
implementations may override this and return whatever
Popup
they desire.
JPopupMenu
previously defined the method
setLocation
. Prior to this release,
this method would invoke
setLocation
on the Popup
, but as we
have removed this method from Popup
,
JPopupMenu
now recreates the
Popup
.
JPopupMenu
also defined the method
setPopupSize
, which invoked
setSize
on the Popup
if it was
visible. Internally, we changed this method to set the
preferred size of the JPopupMenu
, which gives
the same results. If the JPopupMenu
is
visible when this is invoked, the Popup
will be
recreated. The
JPopupMenu
javadoc changed to reflect the new behavior:
public void setPopupSize(Dimension d); public void setPopupSize(int width, int height);