2010-02-10 28 views
10

Tôi có 2 màn hình được kết nối, vì vậy tôi có thể khởi chạy ứng dụng Java của mình trên màn hình chính hoặc màn hình phụ.Làm cách nào để phát hiện màn hình hiện tại bằng Java?

Câu hỏi đặt ra là: Làm cách nào để biết hiển thị nào chứa cửa sổ ứng dụng của tôi, tức là có cách nào để phát hiện màn hình hiện tại với Java không?

Trả lời

21

java.awt.Window là lớp cơ sở của tất cả các cửa sổ cấp cao nhất (Frame, JFrame, Dialog, vv) và nó chứa phương thức getGraphicsConfiguration() trả về GraphicsConfiguration cửa sổ đang sử dụng. GraphicsConfiguration có phương thức getGraphicsDevice() trả về số GraphicsDevice mà GraphicsConfiguration thuộc về. Sau đó bạn có thể sử dụng lớp GraphicsEnvironment để kiểm tra điều này với tất cả các GraphicsDevices trong hệ thống và xem cửa sổ nào thuộc về.

Window myWindow = .... 
// ... 
GraphicsConfiguration config = myWindow.getGraphicsConfiguration(); 
GraphicsDevice myScreen = config.getDevice(); 
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
// AFAIK - there are no guarantees that screen devices are in order... 
// but they have been on every system I've used. 
GraphicsDevice[] allScreens = env.getScreenDevices(); 
int myScreenIndex = -1; 
for (int i = 0; i < allScreens.length; i++) { 
    if (allScreens[i].equals(myScreen)) 
    { 
     myScreenIndex = i; 
     break; 
    } 
} 
System.out.println("window is on screen" + myScreenIndex); 
4

Phương pháp do Nate đề xuất không hoạt động khi màn hình khác vừa được thêm vào hệ thống và người dùng đặt lại cửa sổ Java vào màn hình đó. Đây là một tình huống mà người dùng của tôi thường xuyên phải đối mặt và cách duy nhất xung quanh nó cho tôi là khởi động lại java.exe để buộc nó phải reenumerate các màn hình.

Vấn đề chính là myWindow.getGraphicsConfiguration(). GetDevice() luôn trả về thiết bị gốc khi ứng dụng Java Applet hoặc ứng dụng được khởi động. Bạn sẽ mong đợi nó hiển thị màn hình hiện tại, nhưng kinh nghiệm của riêng tôi (một thời gian rất tốn kém và bực bội) chỉ đơn giản là dựa vào myWindow.getGraphicsConfiguration(). GetDevice() không phải là một cách dễ dàng. Nếu ai đó có cách tiếp cận khác đáng tin cậy hơn, vui lòng cho tôi biết.

Thực hiện kết quả cho màn hình (sử dụng lệnh allScreen [i] .equals (myScreen)) sau đó tiếp tục quay lại màn hình ban đầu nơi Applet được gọi, chứ không phải màn hình mới nơi nó có thể được định vị lại.

+0

hãy kiểm tra câu trả lời ... có thể có hoặc không giúp bạn – Wolf

3

Giải pháp của Nate dường như hoạt động ở nhất, nhưng không phải tất cả trường hợp, như tôi phải trải nghiệm. bối rối đề cập đến ông đã có vấn đề khi màn hình đã kết nối, tôi đã có vấn đề với "Win + Left" và "Win + Right" lệnh chính. Giải pháp của tôi cho vấn đề trông như thế này (có thể giải pháp có vấn đề về chính nó, nhưng ít nhất điều này làm việc tốt hơn cho tôi hơn là giải pháp của Nate):

GraphicsDevice myDevice = myFrame.getGraphicsConfiguration().getDevice(); 
for(GraphicsDevice gd:GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()){ 
    if(frame.getLocation().getX() >= gd.getDefaultConfiguration().getBounds().getMinX() && 
     frame.getLocation().getX() < gd.getDefaultConfiguration().getBounds().getMaxX() && 
     frame.getLocation().getY() >= gd.getDefaultConfiguration().getBounds().getMinY() && 
     frame.getLocation().getY() < gd.getDefaultConfiguration().getBounds().getMaxY()) 
     myDevice=gd; 
} 
Các vấn đề liên quan