Home > javafx > JavaFX – Always On Top

JavaFX – Always On Top

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.

FXDialogUtils { };

Stage {
    x: bind stageX with inverse
    y: bind stageY with inverse
    width: fxCalendar.width
    height: fxCalendar.height
    title: "Calendar"

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 Window or 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

Now you can launch the Calendar as real widget

Yes, its a hack! Keep exploring other possibilities!

Categories: javafx Tags: ,
  1. April 30, 2009 at 2:20 AM

    Good hack.. This is really good.

  2. May 3, 2009 at 4:58 PM

    The JFXtras project has a drop-in replacement for Stage called JFXStage that has some niceties, such as alwaysOnTop, and direct access to the underlying java.awt.Window object:
    It actually uses a similar hack to get at the underlying window, with the advantage that it is maintained for each JavaFX release (I just finished updating the source to handle differences in the upcoming Marina release).

  3. May 3, 2009 at 9:01 PM

    @Stephen Chin Yes, JFXtras is good alternative. But I think it relies on non-public APIs – (com.sun.javafx.* in org.jfxtras.stage.WindowHelper). I just wanted to suggest other options.

  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )


Connecting to %s

%d bloggers like this: