Java setFullScreenWindow() держать на вершине

Я пишу приложение, которое предназначено для запуска на установке с двумя мониторами, с JFrame "Дисплей", работающим в полноэкранном режиме на одном мониторе, и " JFrame" "Управление" на другом мониторе, отправляя инструкции на дисплей. Я пробовал два отдельных способа настройки полноэкранного отображения; Кажется, успех каждого зависит от ОС.

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

Работает в Windows, но JFrame скрывается под док / панелями в OS X и Linux.

Мой другой метод, использующий

GraphicsDevice.setFullScreenWindow(display);

Работает во всех трех операционных системах, которые я пробовал, но в Windows при фокусировке окна управления на другом мониторе окно дисплея скрывается и вызывается

display.setAlwaysOnTop(true);

Не решает проблему. Я отчасти неравнодушен к GraphicsDevice метод, потому что мне не приходится иметь дело с проблемами в OS X или Linux, и я надеюсь, что проблема Windows - это простое решение. Это?

2 ответа

Решение

Попробуй это...

Для нескольких экранов

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, а затем "прикрепить" его к верхней позиции.

Я сталкиваюсь с той же проблемой. Мой способ решить это было переопределить show() функция в jframe и с помощью стратегии буфера никогда не возвращаться из функции 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 устарела). Окно не всегда будет сверху (вы все равно можете перетащить другое окно поверх него), но оно не будет автоматически скрываться, когда вы даете фокус другому окну. Это поведение, которое вы хотите, я думаю.

Примечание: не звоните show в очереди событий, поскольку это сделает очередь событий бесполезной и заставит jframe игнорировать все события. Функция show следует вызывать в новом потоке, тогда все события будут по-прежнему обрабатываться.

Другие вопросы по тегам