views:

538

answers:

1

I've been trying and failing to use the java full screen mode on the primary display of an OSX system. Whatever I've tried I can't seem to get rid of the 'apple' menu bar from the top of the display. I really need to paint over the entire screen. Can anyone tell me how to get rid of the menu?

I've attached an example class which exhibits the problem - on my system the menu is still visible where I would expect to see a completely blank screen.

import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;

public class FullScreenFrame extends JFrame implements KeyListener {

    public FullScreenFrame () {
     addKeyListener(this);
     setUndecorated(true);
     GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();

     if (gd.isFullScreenSupported()) {
      try {
       gd.setFullScreenWindow(this);
      }
      finally {
       gd.setFullScreenWindow(null);
      }
     }
     else {
      System.err.println("Full screen not supported");
     }

     setVisible(true);
    }

    public void keyTyped(KeyEvent e) {}
    public void keyPressed(KeyEvent e) {}
    public void keyReleased(KeyEvent e) {
     setVisible(false);
     dispose();
    }

    public static void main (String [] args) {
     new FullScreenFrame();
    }
}
+5  A: 

I think your problem is here:

try {
        gd.setFullScreenWindow(this);
}
finally {
        gd.setFullScreenWindow(null);
}

finally blocks are always executed, so what happens here is that you window becomes full screen for a brief instant (if that) and then relinquishes the screen immediately.

Also, setVisible(true) is not necessary when you have previously called setFullScreenWindow(this), according to the Javadocs.

So I would change the constructor to this:

public FullScreenFrame() {
    addKeyListener(this);

    GraphicsDevice gd =
            GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();

    if (gd.isFullScreenSupported()) {
        setUndecorated(true);
        gd.setFullScreenWindow(this);
    } else {
        System.err.println("Full screen not supported");
        setSize(100, 100); // just something to let you see the window
        setVisible(true);
    }
}
Michael Myers
Thanks - that works! The try - finally construct was taken from http://java.sun.com/docs/books/tutorial/extra/fullscreen/exclusivemode.html where it suggests this form to prevent the application from keeping the screen after exiting - but it seems I'll have to actively keep the lock on the screen to prevent it being released too early.Thanks!
Simon Andrews
Notice the "..." in there? That's where something that blocks until the window is closed should go. The try...finally approach simply guards against exceptions which might keep your application from releasing the screen when it's done. (Oddly, even though `setFullScreenWindow` makes the window visible, it doesn't block like `setVisible` does. I wonder if that is by design.)
Michael Myers