Java setFullScreenWindow() keep on top

2019-02-12 10:49发布

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?

2条回答
smile是对你的礼貌
2楼-- · 2019-02-12 11:41

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.

查看更多
甜甜的少女心
3楼-- · 2019-02-12 11:48

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.

查看更多
登录 后发表回答