2013-05-17 18 views
10

Mam aplikację, która wymaga wprowadzenia danych przez użytkownika dla hasła.Jak ustalić, czy GraphicsEnvironment istnieje

Co chcę zrobić, to albo odczytać hasło z konsoli (jeśli system obsługuje jeden np. Unix) lub wyświetlić JOptionPane i poprosić użytkownika o podanie hasła (jeśli system operacyjny obsługuje interfejs graficzny np. Windows).

Niektórzy ludzie mogą twierdzić, że konsola będzie zawsze dostępna w obu powyższych przypadkach, więc wejście konsoli będzie wystarczające. Ale problem polega na tym, że aplikacja Java zaczyna używać javaw.exe, a wtedy konsola nie jest dostępna. Tak więc potrzebuję sposobu, aby ustalić, czy mogę zrobić w obu przypadkach.

Mój problem polega na określeniu, czy środowisko, w którym działa aplikacja, obsługuje konsolę lub interfejs graficzny.

wiem, że metoda statyczna istnieje GraphicsEnvironment.isHeadless() ale z doc Java myślę, że ta metoda nie może rozróżnić, czy system operacyjny obsługuje grafikę, ale zamiast, czy system operacyjny może obsługiwać jedno z urządzeń I/O (klawiatury, mysz, ekran).

Czy ktoś wie o tym więcej? Czy mogę odzyskać, jeśli system operacyjny obsługuje środowisko konsoli lub grafiki?

Z góry dziękuję.

+1

See [Czy istnieje bezpieczny sposób programowy, aby ustalić, czy jest to bezpieczne, aby otworzyć okno Swing?] (Http://stackoverflow.com/questions/5893236/is-there-a-safe-programmatic- sposób-by-określić-jeśli-to-by-otworzyć-a-swing-wiatr) – devnull

+0

@devnull dziękuję za odpowiedź. Tak więc, jak sugeruje inny post, metoda isHeadless() wykona zadanie. Musiałem wtedy źle zinterpretować dokumentację Java. Jednak spróbuję znaleźć maszynę unix do uruchomienia aplikacji, a ja opublikuję moje wyniki tutaj. – nikkatsa

Odpowiedz

15

GraphicsEnvironment.isHeadless() powróci true w przypadku:

  • system nieruchomość java.awt.headless został ustawiony na true
  • listy są uruchomione w/system Linux Unix i nie ma zmienny DISPLAY środowisko ustawić

Oto kod, który służy do pobierania właściwości headless:

String nm = System.getProperty("java.awt.headless"); 

    if (nm == null) { 
     /* No need to ask for DISPLAY when run in a browser */ 
     if (System.getProperty("javaplugin.version") != null) { 
      headless = defaultHeadless = Boolean.FALSE; 
     } else { 
      String osName = System.getProperty("os.name"); 
      headless = defaultHeadless = 
       Boolean.valueOf(("Linux".equals(osName) || "SunOS".equals(osName)) && 
           (System.getenv("DISPLAY") == null)); 
     } 
    } else if (nm.equals("true")) { 
     headless = Boolean.TRUE; 
    } else { 
     headless = Boolean.FALSE; 
    } 

Jeśli chcesz się dowiedzieć, czy jest dostępny jakiś ekran, możesz wywołać GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices(), który zwraca wszystkie dostępne ekrany.

import java.awt.GraphicsDevice; 
import java.awt.GraphicsEnvironment; 
import java.awt.HeadlessException; 

public class TestHeadless { 

    private static boolean isReallyHeadless() { 
     if (GraphicsEnvironment.isHeadless()) { 
      return true; 
     } 
     try { 
      GraphicsDevice[] screenDevices = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices(); 
      return screenDevices == null || screenDevices.length == 0; 
     } catch (HeadlessException e) { 
      e.printStackTrace(); 
      return true; 
     } 
    } 

} 
+0

dziękuję za odpowiedź. Moja jedyna troska polega na tym, że kiedy wywołuję metodę isHeadless() i pracuję w środowisku unix konsoli, czy zwróci ona wartość true lub false? Ponieważ z JavaDoc widziałem, że: "Sprawdza, czy wyświetlacz, klawiatura i mysz mogą być obsługiwane w tym środowisku", więc myślałem, że nawet w systemie unix (keybord będzie dostępny), to zwróci true. Ale myślę, że twój kod rozwiąże mój problem. dzięki jeszcze raz. – nikkatsa

+2

@nikkatsa to wszystko wyjaśniono w mojej odpowiedzi powyżej. Ta informacja została bezpośrednio zaczerpnięta z analizy kodu źródłowego. –

Powiązane problemy