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
следует вызывать в новом потоке, тогда все события будут по-прежнему обрабатываться.