By Rakesh Menon on Apr 29, 2009
Stage is the top level container in JavaFX. It provides attributes such as
fullScreen, iconified, opacity, style, icons, resizable, title which loosely maps to corresponding methods in java.awt.Frame.
But it doesn't provide any functionality to create Dialog behavior (modal, no task bar icon etc) and also support for setAlwaysOnTop. These two features are required to get the actual Widget feel. As of now the
Stage shows a taskbar icon for each application.
So here is a workaround.. Create an instance of AWTEventListener. Add the same to default AWT Toolkit so as to listen to all ComponentEvent. This will receive an event when Stage (Frame) resized and shown. Get the instance of Frame from this event. Retrieve the content of the
Frame and add it to new instance of Dialog. Dispose the
Frame. Now set various attributes of
Dialog such as modality, always-on-top and make this
Dialog visible. Now the content of Frame will be shown in Dialog! We may also apply translucency, shaped windows etc to newly created dialog using AWT APIs.
A simple implementation of above approach is provided in FXDialogUtils. This class must be instantiated before
Stage is shown so that it can listen to all events. Example, the code can be embedded in Calendar sample as shown below. That is just adding one line to existing application.
If you just want to change some attributes of
Frame, you may directly obtain the
Frame instance using Frame.getFrames(). This will return an array of
Frame instance. We can get find the frame instance of specified
Stage using its title. We can modify various
Frame properties using this instance.
We may also directly obtain the instance of
AWT Window equivalent of
Stage using some JavaFX internal APIs, but that may not be compatible across releases. But yes, that is another way of doing it
Yes, its a hack! Keep exploring other possibilities!