Pytanie Zestaw JavaFullScreenWindow () pozostaje na wierzchu


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łając instrukcje 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.

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

Działa w Windows, ale JFrame zostaje ukryty pod dockiem / panelami w OS X i Linux.

Moja inna metoda, wykorzystanie

GraphicsDevice.setFullScreenWindow(display);

Działa we wszystkich trzech systemach, które wypróbowałem, ale w Windows, skupienie okna Kontroli na innym monitorze powoduje, że okno wyświetlacza ukrywa się i wywołuje

display.setAlwaysOnTop(true);

Nie rozwiązuje problemu. Jestem trochę stronniczy w stosunku do GraphicsDevice metoda, 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?


12
2017-07-16 03:55


pochodzenie




Odpowiedzi:


Spróbuj tego...

Dla wielu ekranów

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

Posługiwać się public final void setAlwaysOnTop(boolean alwaysOnTop) za umieszczenie okna na górze, jeśli okno jest widoczne, obejmuje to przyniesienie okna toFront, a następnie "przyklejenie" go do najwyższej pozycji.


10
2017-07-16 06:29



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
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"); aby sprawdzić, czy obecny system operacyjny to Windows, więc zamiast tego mogę użyć setExtendedState metoda. - BitFiber
Przepraszam, bo to nie działało dla ciebie, ale dzięki za informację o pracy nad .... - Kumar Vivek Mitra
Więc +1 na twoje pytanie ..... - Kumar Vivek Mitra
Mam ten sam problem w systemie Windows, które było rozwiązaniem? Próbowałem użyć'setExtendedState (JFrame.MAXIMIZED_BOTH) ', ale nie działa w niektórych scenariuszach i kiedy działa, grafika nie jest aktualizowana. - AngelAvila


Przebiegam ten sam problem. Moim sposobem na rozwiązanie tego problemu było przesłonięcie show() funkcja w jframe i przy użyciu a strategia buforowania nigdy nie wyjdzie 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)
              }
        }
 }

Byłoby lepiej, gdyby ktoś użył 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 dzwoń show w eventqueue, ponieważ spowoduje to, że eventqueue będzie bezużyteczne, i sprawi, że jframe zignoruje wszystkie zdarzenia. Funkcja show powinien zostać wywołany w nowym wątku, a następnie wszystkie zdarzenia będą nadal obsługiwane.


4
2017-12-04 23:00