2013-05-17 33 views
10

Tôi có một ứng dụng cần nhập bằng mật khẩu của người dùng.Cách xác định xem GraphicsEnvironment có tồn tại hay không

Điều tôi muốn làm là đọc mật khẩu từ bảng điều khiển (nếu hệ điều hành hỗ trợ một ví dụ) hoặc hiển thị JOptionPane và yêu cầu người dùng nhập mật khẩu của mình (nếu hệ điều hành hỗ trợ giao diện đồ họa, ví dụ: cửa sổ).

Một số người có thể lập luận rằng một bảng điều khiển sẽ luôn có sẵn trong cả hai trường hợp trên, do đó đầu vào bảng điều khiển sẽ là đủ. Nhưng vấn đề là nếu ứng dụng Java bắt đầu sử dụng javaw.exe thì một giao diện điều khiển không có sẵn. Vì vậy, tôi cần một cách để xác định xem tôi có thể làm một trong hai trường hợp hay không.

Vấn đề của tôi là cách xác định xem môi trường mà ứng dụng chạy từ hỗ trợ hoặc giao diện điều khiển hoặc giao diện đồ họa.

Tôi biết rằng một phương pháp tĩnh tồn tại GraphicsEnvironment.isHeadless() nhưng từ doc Java tôi nghĩ rằng phương pháp này không thể phân biệt nếu hệ điều hành hỗ trợ đồ họa, nhưng thay vì nếu hệ điều hành có thể hỗ trợ một trong những thiết bị I/O (bàn phím, chuột, màn hình).

Có ai biết thêm về điều này không? Tôi có thể truy xuất nếu hệ điều hành hỗ trợ giao diện điều khiển hoặc môi trường đồ họa không?

Xin cảm ơn trước.

+1

Xem [Có cách an toàn, có lập trình để xác định xem có an toàn để mở cửa sổ Swing không?] (Http://stackoverflow.com/questions/5893236/is-there-a-safe-programmatic- cách để xác định-nếu-nó-an toàn-để-mở-một-swing-gió) – devnull

+0

@ devnull cảm ơn bạn đã trả lời. Vì vậy, thực sự, như bài viết khác cho thấy, phương thức isHeadless() sẽ thực hiện công việc. Tôi phải hiểu sai tài liệu Java rồi. Tuy nhiên, tôi sẽ cố gắng tìm một máy unix để chạy các ứng dụng và tôi sẽ đăng phát hiện của tôi trở lại đây. – nikkatsa

Trả lời

15

GraphicsEnvironment.isHeadless() sẽ trở lại true trong trường hợp:

  • hệ thống sở hữu java.awt.headless đã được thiết lập để true
  • của bạn đang chạy trên một hệ thống Unix/Linux và không có biến DISPLAY môi trường thiết

Đây là mã được sử dụng để truy xuất thuộc tính không có đầu:

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

Nếu bạn muốn biết nếu có bất kỳ màn hình nào có sẵn, bạn có thể gọi GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices() trả về tất cả các màn hình có sẵn.

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

cảm ơn bạn đã trả lời. Mối quan tâm duy nhất của tôi là, khi tôi gọi phương thức isHeadless() và tôi đang chạy trên một môi trường console unix, nó sẽ trả về true hay false? Bởi vì từ JavaDoc tôi có thể thấy rằng: "Kiểm tra xem một màn hình, bàn phím và chuột có thể được hỗ trợ trong môi trường này", do đó tôi nghĩ ngay cả trong unix (keybord sẽ availble) nó sẽ trả về true. Nhưng tôi nghĩ rằng mã của bạn sẽ giải quyết được vấn đề của tôi. cảm ơn một lần nữa. – nikkatsa

+2

@nikkatsa tất cả đều được giải thích trong câu trả lời của tôi ở trên. Thông tin này đã được lấy trực tiếp từ việc phân tích mã nguồn. –