Fullscreen mode and transparent windows are supported in JavaSE 6 since update 10. I have developed the SideBar example for the JavaOne 2008 by using proprietary Java API to create translucent window that slides out of the right side of the screen. Now I am ready to show the SideBar example created by using the JavaFX API only.

Let's create a fullscreen window first. In the current implementation such windows can be opaque only. By this reason this window cannot be used as a SideBar, but its width and height will be further used.

def screen = Stage {
  fullScreen: true
}

You should wait until the window appears in order to initialize its dimensions. As soon as the window's height becomes greater than 0, you can close the window and use its dimensions to initialize the main window. Note that if the auxiliary fullscreen window is closed before the main window is shown up, the application terminates.

def height = bind screen.height on replace {
  if (height > 0) {
    screen.close();
    // initialize main stage
    ...
  }
}

The main window contains the following content.

The base of the window is a translucent shape intended for processing of mouse events. This shape is based on a rectangle, whose left edge is a cubic curve instead of a line. Note that the shape of the window is not set, because JavaFX has no appropriate API. Besides, shaped windows do not support anti-aliasing.

        Path {
          fill: COLOR
          opacity: OPACITY
          elements: [
            MoveTo {
              x: stage.width
            }
            HLineTo {
              x: offset
            }
            CubicCurveTo {
              x: offset   controlX1: x1   controlX2: x2
              y: height   controlY1: y1   controlY2: y2
            }
            HLineTo {
              x: stage.width
            }
          ]
        }

The left edge of the shape is set off with a thick opaque cubic curve, whose parameters match those of the basic shape.

        CubicCurve {
          fill: null
          stroke: COLOR
          strokeWidth: 4
          startX: offset
          endX: offset   controlX1: x1   controlX2: x2
          endY: height   controlY1: y1   controlY2: y2
        }

Drawn over the shape is the rotated translucent text. Although the text has the same color and opacity as the basic shape, the text looks less transparent, because the opacity values are summed up.

        Text {
          content: "JavaFX"
          opacity: OPACITY
          fill: COLOR
          font: Font {size: 220}
          scaleY: 0.8
          translateX: 240
          translateY: height
          transforms: Rotate {angle: 270}
        }

The close button is drawn in the right top corner of the main window.

        Group {
          translateX: stage.width - 22
          translateY: 22
          cursor: Cursor.HAND
          content: [
            Circle {
              fill: COLOR
              opacity: OPACITY
              radius: 8
            }
            Line {
              stroke: COLOR
              strokeWidth: 4
              strokeLineCap: ROUND
              startX: -4   endX:  3
              startY: -4   endY:  3
            }
            Line {
              stroke: COLOR
              strokeWidth: 4
              strokeLineCap: ROUND
              startX: -4   endX:  3
              startY:  3   endY: -4
            }
          ]
          onMouseClicked: function(event) {
            stage.close()
          }
        }

The logo of Sun Microsystems is added to the center of the window. The clock widget from my first post about JavaFX is added over the logo. Note that thepaused variable of the clock widget is bound to thevisible variable. Thus you do not waste the processor time to update the hidden clocks.

        ImageView {
          translateX: stage.width - 142
          translateY: 224
          image: Image {
            url: "{__DIR__}sun.png"
          }
        }
        Clock {
          translateX: stage.width - 222
          translateY: 22
          paused: bind not visible
          radius: 100
          fill: COLOR
        }

The SideBar slides out when the mouse cursor hovers over the SideBar content and slides in when the mouse cursor leaves the window.

def slide = Timeline {
  keyFrames: [
    at (0s) {stage.x => screen.width - stage.width}
    at (1s) {stage.x => screen.width - stage.width / 10}
  ]
}
var visible = bind group.hover on replace {
  slide.rate = if (visible) -1 else 1;
  slide.play()
}

This approach has a couple of disadvantages. First, JavaFX has no API to keep the window on top of other windows even if it has the focus. Second, the closed fullscreen window does not receive events on the screen resolution changes. Therefore the SideBar will work incorrectly when the resolution changes.

http://java.sun.com/products/jfc/tsc/sightings/images/webstart.small.jpg

Note that the application is signed and requires all permissions to slide out off the screen. The source file of the example is available.

https://malenkov.dev.java.net/20090318/desktop.png