Java setFullScreenWindow() Keep on top

2022-09-04 21:15:27

我正在编写一个应用程序,该应用程序旨在在双显示器设置上运行,其中“显示”JFrame在一个显示器上全屏显示,在另一个显示器上显示“控制”JFrame,向显示器发送指令。我尝试了两种不同的方法来设置全屏显示;每个的成功似乎都取决于操作系统。

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

在Windows中工作,但JFrame隐藏在OS X和Linux中的扩展坞/面板下。

我的另一种方法,利用

GraphicsDevice.setFullScreenWindow(display);

在我尝试过的所有三个操作系统中都有效,但在 Windows 中,将“控制”窗口聚焦在另一台监视器上会使“显示”窗口隐藏,并调用

display.setAlwaysOnTop(true);

不能解决问题。我有点偏向于这种方法,因为我不必处理OS X或Linux中的问题,我希望Windows问题是一个简单的解决方案。是吗?GraphicsDevice


答案 1

试试这个...

对于多屏幕

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();
}

用于将窗口放在顶部,如果窗口可见,这包括 将窗口 ,然后将其“粘贴”到最顶部位置。public final void setAlwaysOnTop(boolean alwaysOnTop)toFront


答案 2

我遇到了同样的问题。我解决这个问题的方法是覆盖jframe中的函数,并且通过使用缓冲区策略永远不会从show函数中返回。因此,像这样:show()

 @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)
              }
        }
 }

实际上,如果使用一个而不是(被弃用)会更好。该窗口不会始终位于顶部(您仍然可以在其顶部拖动另一个窗口),但是当您将焦点分配给另一个窗口时,它不会自动隐藏。我猜这就是你想要的行为。setVisible(boolean)show()show

注意:不要在事件队列中调用,因为这会使事件队列无用,并使 jframe 忽略所有事件。该函数应该在新线程中调用,然后仍将处理所有事件。showshow


推荐