2013-05-17 22 views
10

Ho un'applicazione che richiede l'input dell'utente per la password.Come determinare se GraphicsEnvironment esiste

Quello che voglio fare è leggere la password dalla console (se il sistema operativo supporta uno e.g unix) o visualizzare un JOptionPane e chiedere all'utente di inserire la sua password (se il sistema operativo supporta l'interfaccia grafica ad esempio windows).

Alcune persone potrebbero obiettare che una console sarà sempre disponibile in entrambi i casi sopra, quindi sarà sufficiente un input da console. Ma il problema è se l'app Java inizia a utilizzare javaw.exe, quindi una console non è disponibile. Quindi, ho bisogno di un modo per determinare se posso fare entrambi i casi.

Il mio problema è come determinare se l'ambiente in cui viene eseguita l'applicazione supporta una console o un'interfaccia grafica.

so che un metodo statico esiste GraphicsEnvironment.isHeadless() ma dal doc Java penso che questo metodo non può distinguere se il sistema operativo supporta la grafica, ma piuttosto che se il sistema operativo in grado di supportare uno dei dispositivi di I/O (tastiera, mouse, schermo).

Qualcuno ne sa di più? Sono in grado di recuperare se il sistema operativo supporta la console o l'ambiente grafico?

Grazie in anticipo.

+1

Sede [C'è un modo sicuro e programmatico per determinare se è sicuro per aprire una finestra Swing?] (Http://stackoverflow.com/questions/5893236/is-there-a-safe-programmatic- strada-per-determinare-se-è-sicuro-aprire-un-swing-vento) – devnull

+0

@devnull grazie per la risposta. Quindi, in realtà, come suggerisce l'altro post, il metodo isHeadless() farà il lavoro. Devo aver interpretato male la documentazione Java allora. Tuttavia, cercherò di trovare una macchina Unix per eseguire l'app e posterò le mie scoperte qui. – nikkatsa

risposta

15

GraphicsEnvironment.isHeadless() tornerà true nel caso in cui:

  • il sistema di proprietà java.awt.headless è stata impostata su true
  • vostro sono in esecuzione su un sistema Unix/Linux e non v'è nessuna variabile DISPLAY ambiente impostare

Ecco il codice utilizzato per recuperare la proprietà senza testa:

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

Se si desidera sapere se è disponibile uno schermo, è possibile richiamare GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices() che restituisce tutte le schermate disponibili.

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

grazie per la risposta. La mia unica preoccupazione è che, quando invoco il metodo isHeadless() e sono in esecuzione su un ambiente console unix, restituirà true o false? Perché dal JavaDoc ho potuto vedere che: "Verifica se un display, una tastiera e un mouse possono essere supportati in questo ambiente", quindi ho pensato che anche in unix (la tastiera sarà disponibile) restituirà true. Ma penso che il tuo codice risolverà il mio problema. grazie ancora. – nikkatsa

+2

@nikkatsa è tutto spiegato nella mia risposta sopra. Questa informazione è stata presa direttamente dall'analisi del codice sorgente. –

Problemi correlati