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

Я пишу приложение, которое предназначено для запуска на установке с двумя мониторами, с JFrame «Display» в полноэкранном режиме на одном мониторе и JFrame «Control» на другом мониторе, отправляя инструкции на дисплей. Я пробовал два разных метода настройки полноэкранного режима отображения; успех каждого, кажется, зависит от ОС.

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 решается просто. Это?


person BitFiber    schedule 16.07.2012    source источник


Ответы (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, а затем «приклеивание» его к самой верхней позиции.

person Kumar Vivek Mitra    schedule 16.07.2012
comment
Спасибо за ответ, но что мне делать со значениями ширины и высоты из цикла for? Я пытался использовать setAlwaysOnTop(true);, но это не сработало, когда я попробовал. У меня нет доступа к Windows еще час или около того, но я заметил, что вы сказали, если окно видимо, так что, может быть, я назвал это перед тем, как сделать окно видимым? Я попробую в ближайшее время и приму ваш ответ, если он сработает. - person BitFiber; 16.07.2012
comment
Слишком поздно редактировать мой комментарий... но setAlwaysOnTop(true); по-прежнему не работает в Windows. Однако я нашел обходной путь, используя System.getProperty("os.name");, чтобы проверить, является ли текущая ОС Windows, поэтому вместо этого я могу использовать метод setExtendedState. - person BitFiber; 16.07.2012
comment
Извините, у вас это не сработало, но спасибо за информацию об обходном пути.... - person Kumar Vivek Mitra; 16.07.2012
comment
У меня такая же проблема на винде, какое решение? Я пытался использовать «setExtendedState(JFrame.MAXIMIZED_BOTH)», но в некоторых сценариях он не работает, а когда работает, графика не обновляется. - person AngelAvila; 11.05.2018
comment
Этот ответ никак не связан с вопросом. Я не понимаю, как это можно отметить как правильное и получить +10 - person Newbie; 10.04.2020

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

person user23127    schedule 04.12.2012