2013-05-17 55 views
10

我有一個需要用戶輸入密碼的應用程序。如何確定圖形環境是否存在

我想要做的是從控制檯讀取密碼(如果操作系統支持一個例如unix)或顯示JOptionPane並要求用戶輸入密碼(如果操作系統支持圖形界面,例如Windows)。

有些人可能會爭辯說,在上述兩種情況下控制檯總是可用,所以控制檯輸入就足夠了。但問題是如果Java應用程序開始使用javaw.exe,那麼控制檯不可用。因此,我需要一種方法來確定我是否可以做任何一種情況。

我的問題是如何確定應用程序運行的環境是否支持控制檯或圖形界面。

我知道,一個靜態方法存在 GraphicsEnvironment.isHeadless() 但是從Java文檔我認爲這種方法無法區分如果操作系統支持的圖形,但不是如果操作系統可以支持I/O設備之一(鍵盤,鼠標,屏幕)。

有沒有人知道更多關於此?我能夠檢索操作系統是否支持控制檯或圖形環境?

在此先感謝。

+1

參見[有沒有一個安全的,有計劃的方式,以確定它是否安全地打開一個Swing窗口?](http://stackoverflow.com/questions/5893236/is-there-a-safe-programmatic-如何確定它是否安全地打開擺動風) – devnull

+0

@devnull謝謝你的回答。實際上,正如另一篇文章所暗示的,isHeadless()方法將完成這項工作。那麼我一定錯誤地解釋了Java文檔。但是,我會嘗試找到一個unix機器來運行該應用程序,我會將我的發現發佈回來。 – nikkatsa

回答

15

GraphicsEnvironment.isHeadless()將情況返回true

  • 系統屬性java.awt.headless已設置爲true
  • 你是一個Unix/Linux系統上運行,並且沒有DISPLAY環境變量設置

以下是用於檢索無頭特性的代碼:

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

如果你想知道是否有任何屏幕可用,你可以調用GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()返回所有可用的屏幕。

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

謝謝你的答案。我唯一擔心的是,當我調用isHeadless()方法並且我在控制檯unix環境中運行時,它會返回true還是false?因爲從JavaDoc我可以看到:「測試是否可以在此環境中支持顯示器,鍵盤和鼠標」,因此我甚至認爲即使在unix(keybord將可用)它將返回true。但我認爲你的代碼將解決我的問題。再次感謝。 – nikkatsa

+2

@nikkatsa這一切都在我上面的答案中解釋。這些信息直接來源於對源代碼的分析。 –