2012-07-16 7 views
12

Tôi đang viết một ứng dụng được thiết kế để chạy trên một thiết lập màn hình kép, với một "Hiển thị" JFrame đi toàn màn hình trên một màn hình và một "Control" JFrame trên màn hình khác, gửi hướng dẫn đến Hiển thị. Tôi đã thử hai phương pháp riêng biệt để cài đặt Hiển thị toàn màn hình; sự thành công của mỗi dường như phụ thuộc vào hệ điều hành.Java setFullScreenWindow() giữ trên

display.setUndecorated(true); 
display.setExtendedState(JFrame.MAXIMIZED_BOTH); 

trình trong Windows, nhưng JFrame được ẩn dưới bến tàu/tấm trong OS X và Linux.

phương pháp khác của tôi, sử dụng

GraphicsDevice.setFullScreenWindow(display); 

trình trong cả ba hệ điều hành mà tôi đã cố gắng, nhưng trong Windows, tập trung các cửa sổ Control trên màn hình khác làm cho ẩn cửa sổ hiển thị, và kêu gọi

display.setAlwaysOnTop(true); 

Không khắc phục được sự cố. Tôi là một phần của phương pháp GraphicsDevice bởi vì tôi không phải đối phó với các vấn đề trong OS X hoặc Linux, và tôi hy vọng rằng vấn đề Windows là một sửa chữa đơn giản. Là nó?

Trả lời

10

Hãy thử này ...

Đối Nhiều Screen

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
GraphicsDevice[] gs = ge.getScreenDevices(); 


// Get size of each screen 

for (int i=0; i<gs.length; i++) { 
    DisplayMode dm = gs[i].getDisplayMode(); 
    int screenWidth = dm.getWidth(); 
    int screenHeight = dm.getHeight(); 
} 

Sử dụng public final void setAlwaysOnTop(boolean alwaysOnTop) cho đặt các cửa sổ trên đầu trang, Nếu cửa sổ có thể nhìn thấy, điều này bao gồm việc đưa cửa sổ toFront, sau đó "gắn bó" nó đến vị trí cao nhất.

+0

Cảm ơn bạn đã trả lời, nhưng tôi phải làm gì với các giá trị chiều rộng và chiều cao từ đó cho vòng lặp? Tôi đã thử sử dụng 'setAlwaysOnTop (true);', nhưng điều đó không hiệu quả khi tôi thử nó. Tôi không có quyền truy cập vào Windows trong một giờ nữa, nhưng tôi nhận thấy bạn đã nói "Nếu cửa sổ hiển thị", có lẽ tôi đã gọi nó trước khi đặt cửa sổ hiển thị? Tôi sẽ cố gắng sớm và chấp nhận câu trả lời của bạn nếu nó hoạt động. – BitFiber

+0

Quá muộn để chỉnh sửa nhận xét của tôi ... nhưng 'setAlwaysOnTop (true);' vẫn không hoạt động trong Windows. Tuy nhiên, tôi đã tìm thấy cách giải quyết khác khi sử dụng 'System.getProperty (" os.name ");' để kiểm tra xem hệ điều hành hiện tại có phải là Windows hay không, vì vậy tôi có thể sử dụng phương thức 'setExtendedState'. – BitFiber

+0

Xin lỗi vì nó không hoạt động cho bạn, nhưng cảm ơn thông tin đã làm việc xung quanh .... –

4

Tôi chạy trên cùng một vấn đề. Cách của tôi để giải quyết nó là để ghi đè lên các chức năng show() trong jframe và bằng cách sử dụng một buffer strategy không bao giờ trở lại ra khỏi chức năng hiển thị. Như vậy một cái gì đó như thế này:

@override 
public void show(){ 
     super.show(); 
     //Create a double buffering strategy 
     createBufferStrategy(2); 
     BufferStrategy bs = getBufferStrategy(); 
     while(true){ 
       //draw our frame 
       Graphics g = bs.getGraphics(); 
       paint(g); 
       //dispose of our graphics 
       g.dispose(); 
       //Show our frame 
       bs.show(); 
       try{ 
        //Don't use all our cpu-power 
        Thread.sleep(10); 
       }catch(Exception e){ 
        //Do something (this probably will never happen) 
       } 
     } 
} 

Nó sẽ thực sự được tốt hơn nếu ta dùng setVisible(boolean) thay vì show() (show bị phản đối). Cửa sổ sẽ không luôn luôn ở trên cùng (bạn vẫn có thể kéo một cửa sổ khác lên trên nó), nhưng nó sẽ không tự động ẩn khi bạn tập trung vào một cửa sổ khác. Đó là hành vi bạn muốn tôi đoán.

Lưu ý: Không gọi show trong sự kiện này, vì điều này sẽ khiến sự kiện này vô dụng và làm cho khung hình bị bỏ qua tất cả các sự kiện. Hàm show nên được gọi trong một chuỗi mới, sau đó tất cả các sự kiện sẽ vẫn được xử lý.