2012-07-16 13 views
12

Piszę aplikację, która ma być uruchamiana w konfiguracji z dwoma monitorami, z JFrame "Display" przechodzącą w tryb pełnoekranowy na jednym monitorze i JFrame "Control" na innym monitorze, wysyłanie instrukcji do wyświetlacza. Próbowałem dwóch oddzielnych metod ustawiania wyświetlania na pełnym ekranie; sukces każdego wydaje się zależeć od systemu operacyjnego.Zestaw JavaFullScreenWindow() na bieżąco

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

Działa w systemie Windows, ale JFrame zostaje ukryty pod stacją dokującą/panelami w systemie OS X i Linux.

Mój inny sposób, wykorzystując

GraphicsDevice.setFullScreenWindow(display); 

działa we wszystkich trzech systemów operacyjnych, które próbowałem, ale w systemie Windows, koncentrując się okno sterowania na drugim monitorze sprawia ekranie okno ukrywanie i nazywając

display.setAlwaysOnTop(true); 

Nie rozwiązuje problemu. Jestem trochę stronniczy od metody GraphicsDevice, ponieważ nie mam do czynienia z problemami w systemie OS X lub Linux i mam nadzieję, że problem z Windowsem jest prostą naprawą. Czy to jest?

Odpowiedz

10

Spróbuj tego ...

Dla wielu ekranie

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

Zastosowanie public final void setAlwaysOnTop(boolean alwaysOnTop) na umieszczenie okna na górze, Jeżeli okno jest widoczne, to obejmuje okno toFront doprowadzenie, a następnie „przyklejania” do najwyższej pozycji.

+0

Dziękuję za odpowiedź, ale co mam zrobić z wartościami szerokości i wysokości z tej pętli? Próbowałem użyć 'setAlwaysOnTop (true);', ale to nie zadziałało, gdy próbowałem. Nie mam dostępu do systemu Windows przez kolejną godzinę, ale zauważyłem, że powiedziałeś "jeśli okno jest widoczne", więc może nazwałem to przed ustawieniem okna? Spróbuję wkrótce i zaakceptuję twoją odpowiedź, jeśli to zadziała. – BitFiber

+0

Za późno, aby edytować mój komentarz ... ale 'setAlwaysOnTop (true);' nadal nie działa w systemie Windows. Jednak znalazłem obejście w użyciu 'System.getProperty (" os.name ");' sprawdzić, czy obecny system operacyjny to Windows, więc zamiast tego mogę użyć metody 'setExtendedState'. – BitFiber

+0

Przepraszam, bo to nie działało dla ciebie, ale dzięki za informację o pracy nad ... –

4

Przebiegam ten sam problem. Moim sposobem na rozwiązanie tego problemu było zastąpienie funkcji show() w jframe i użycie funkcji buffer strategy nigdy nie powracającej z funkcji show. Tak więc coś takiego:

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

To rzeczywiście będzie lepiej, jeśli jeden używany setVisible(boolean) zamiast show() (show jest przestarzałe). Okno nie zawsze będzie na wierzchu (nadal możesz przeciągnąć kolejne okno), ale nie będzie ono automatycznie ukrywane, gdy ustawisz ostrość w innym oknie. Takie zachowanie chciałem zgadnąć.

Uwaga: Nie nazywaj show w EventQueue, gdyż uniemożliwiała EventQueue bezużyteczne, i sprawia, że ​​JFrame zignorować wszystkie zdarzenia. Funkcja show powinna zostać wywołana w nowym wątku, wtedy wszystkie zdarzenia będą nadal obsługiwane.

Powiązane problemy