Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java setFullScreenWindow() keep on top

I'm writing an application that is intended to be run on a dual monitor setup, with a "Display" JFrame going fullscreen on one monitor and a "Control" JFrame on the other monitor, sending instructions to the Display. I've tried two separate methods of setting the Display fullscreen; the success of each seems to depend on the OS.

display.setUndecorated(true);
display.setExtendedState(JFrame.MAXIMIZED_BOTH);

Works in Windows, but the JFrame gets hidden under the dock/panels in OS X and Linux.

My other method, utilizing

GraphicsDevice.setFullScreenWindow(display);

Works in all three OSes that I tried, but in Windows, focusing the Control window on the other monitor makes the Display window hide, and calling

display.setAlwaysOnTop(true);

Doesn't fix the problem. I'm kind of partial to the GraphicsDevice method because I don't have to deal with the issues in OS X or Linux, and I'm hoping that the Windows problem is a simple fix. Is it?

like image 576
BitFiber Avatar asked Jul 16 '12 03:07

BitFiber


People also ask

How do you make a JFrame always on top?

How do I set a JFrame always on top? After you create another window, call toFront() on your JFrame that you want to be at the front. myFrame. setAlwaysOnTop(true);

What is GraphicsDevice java?

The GraphicsDevice class describes the graphics devices that might be available in a particular graphics environment. These include screen and printer devices. Note that there can be many screens and many printers in an instance of GraphicsEnvironment .


2 Answers

Try this...

For Multiple Screen

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gs = ge.getScreenDevices();


// Get size of each screen

for (int i=0; i<gs.length; i++) {
    DisplayMode dm = gs[i].getDisplayMode();
    int screenWidth = dm.getWidth();
    int screenHeight = dm.getHeight();
}

Use public final void setAlwaysOnTop(boolean alwaysOnTop) for putting the window on top, If the window is visible, this includes bringing window toFront, then "sticking" it to the top-most position.

like image 94
Kumar Vivek Mitra Avatar answered Oct 22 '22 05:10

Kumar Vivek Mitra


I run across the same problem. My way to solve it was to override the show() function in the jframe and by using a buffer strategy never return out of the show function. Thus something like this:

 @override
 public void show(){
        super.show();
        //Create a double buffering strategy
        createBufferStrategy(2);
        BufferStrategy bs = getBufferStrategy();
        while(true){
              //draw our frame
              Graphics g = bs.getGraphics();
              paint(g);
              //dispose of our graphics
              g.dispose();
              //Show our frame
              bs.show();
              try{
                  //Don't use all our cpu-power
                  Thread.sleep(10);
              }catch(Exception e){
                  //Do something (this probably will never happen)
              }
        }
 }

It would actually be better if one used setVisible(boolean) instead of show() (show is deprecated). The window won't always be on top (you can still drag another window on top of it), but it won't automatically hide when you give focus to another window. That is the behaviour you want I guess.

Note: Do not call show in the eventqueue, as this will render the eventqueue useless, and makes the jframe ignore all events. The function show should be called in a new thread, then all events will still be handled.

like image 24
user23127 Avatar answered Oct 22 '22 05:10

user23127