2013-05-17 7 views
10

Ich habe eine Anwendung, die Benutzereingabe für Kennwort benötigt.Wie zu bestimmen, ob GraphicsEnvironment vorhanden ist

Ich möchte entweder das Passwort von der Konsole lesen (wenn das Betriebssystem eines unterstützt, z. B. Unix) oder ein JOptionPane anzeigen und den Benutzer zur Eingabe seines Passworts auffordern (wenn das Betriebssystem die grafische Benutzeroberfläche Windows unterstützt).

Einige Leute mögen argumentieren, dass eine Konsole in beiden Fällen immer verfügbar sein wird, so dass eine Konsoleneingabe ausreicht. Problem ist jedoch, wenn die Java-App javaw.exe verwendet und eine Konsole nicht verfügbar ist. Daher brauche ich einen Weg, um festzustellen, ob ich beides tun kann.

Mein Problem besteht darin, festzustellen, ob die Umgebung, in der die Anwendung ausgeführt wird, entweder eine Konsole oder eine grafische Benutzeroberfläche unterstützt.

Ich weiß, dass eine statische Methode GraphicsEnvironment.isHeadless() aber aus dem Java-doc existiert Ich denke, dass diese Methode nicht unterscheiden kann, wenn das O Grafik unterstützt, sondern eher, als wenn das O eine der E/A-Geräte unterstützen kann (Tastatur, Maus, Bildschirm).

Weiß jemand mehr darüber? Kann ich abrufen, ob das Betriebssystem die Konsolen- oder Grafikumgebung unterstützt?

Vielen Dank im Voraus.

+1

See [Gibt es eine sichere, programmatische Art und Weise zu bestimmen, ob es sicher ist, ein Swing-Fenster zu öffnen?] (Http://stackoverflow.com/questions/5893236/is-there-a-safe-programmatic- Weg-zu-bestimmen-wenn-es-sicher-zu-öffnen-ein-Schwung-Wind) – devnull

+0

@devnull danke für Ihre Antwort. Wie der andere Beitrag schon andeutet, wird die Methode isHeadless() die Aufgabe übernehmen. Ich muss die Java-Dokumentation dann falsch interpretiert haben. Allerdings werde ich versuchen, eine Unix-Maschine zu finden, um die App zu starten, und ich werde meine Ergebnisse hier zurück posten. – nikkatsa

Antwort

15

GraphicsEnvironment.isHeadless() wird true bei Rückkehr:

  • die Systemeigenschaft java.awt.headless hat true gesetzt worden
  • Ihr auf einem Unix/Linux-System ausgeführt werden und es gibt keine DISPLAY Umgebungsvariable

Hier ist der Code, der verwendet wird, um die kopflose Eigenschaft abzurufen:

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

Wenn Sie wissen möchten, ob ein Bildschirm verfügbar ist, können Sie GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices() aufrufen, das alle verfügbaren Bildschirme zurückgibt.

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

danke für die Antwort. Meine einzige Sorge ist, dass, wenn ich die isHeadless() -Methode aufruft und ich auf einer Konsolen-Unix-Umgebung laufe, wird es wahr oder falsch zurückgeben? Da ich von JavaDoc Folgendes sehen konnte: "Prüft, ob eine Anzeige, Tastatur und Maus in dieser Umgebung unterstützt werden können", also dachte ich, selbst in Unix (Keyboard wird verfügbar sein) wird es wahr zurückgeben. Aber ich denke, dass dein Code mein Problem lösen wird. Danke noch einmal. – nikkatsa

+2

@nikkatsa alles ist in meiner Antwort oben erklärt. Diese Information wurde direkt aus der Analyse des Quellcodes entnommen. –