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