2009-12-20 35 views
11

Một đoạn mã từ ứng dụng Java của tôi:java & fullscreen trên nhiều màn hình

JFrame f = new JFrame(); 
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
GraphicsDevice gd = ge.getDefaultScreenDevice(); 
gd.setFullScreenWindow(f); 

Vì vậy, những gì nó làm là làm cho nó tự độ toàn màn hình. Bây giờ điều kỳ lạ là chương trình là toàn màn hình nhưng chỉ trên một màn hình! Ví dụ: Tôi có một hệ thống cửa sổ vista với hai màn hình được kết hợp trong một máy tính để bàn. Điều gì sẽ làm tự động cho phép hiển thị toàn màn hình trên tất cả các màn hình?


Ok Tôi cố gắng đó:

import java.awt.image.ColorModel; 
import java.awt.GraphicsConfiguration; 
import java.awt.GraphicsDevice; 
import java.awt.GraphicsEnvironment; 
import java.awt.Rectangle; 

class grdevs 
{ 
    public static void main(String [] args) 
    { 
     GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     GraphicsDevice[] gs = ge.getScreenDevices(); 
     for(GraphicsDevice curGs : gs) 
     { 
      GraphicsConfiguration[] gc = curGs.getConfigurations(); 
      for(GraphicsConfiguration curGc : gc) 
      { 
       Rectangle bounds = curGc.getBounds(); 
       ColorModel cm = curGc.getColorModel(); 

       System.out.println("" + bounds.getX() + "," + bounds.getY() + " " + bounds.getWidth() + "x" + bounds.getHeight() + " " + cm); 
      } 
     } 
    } 
} 

nhưng nó mang lại:

0.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 
0.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 
0.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 
0.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 
0.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 
0.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 
1024.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 
1024.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 
1024.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 
1024.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 
1024.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 
1024.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 

Ví dụ tôi mong chờ một thiết bị có khả năng 2048x768 khi chúng được kết hợp trong một (Tôi nhấp vào " mở rộng máy tính để bàn ").

Trả lời

6

Bạn có thể thử:

int width = 0; 
int height = 0; 
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
GraphicsDevice[] gs = ge.getScreenDevices(); 
for (GraphicsDevice curGs : gs) 
{ 
    DisplayMode mode = curGs.getDisplayMode(); 
    width += mode.getWidth(); 
    height = mode.getHeight(); 
} 

này nên tính toán tổng chiều rộng của nhiều màn hình. Rõ ràng nó chỉ hỗ trợ màn hình theo chiều ngang trong mẫu ở trên - bạn phải phân tích các giới hạn của các cấu hình đồ họa để xử lý các sắp xếp màn hình khác (phụ thuộc vào cách bạn muốn tạo ra nó).

Edit: Và sau đó thiết lập kích thước của khung hình của bạn: f.setSize(width, height);

+0

Tôi đồng ý. Hành vi thông thường là tối đa hóa/toàn màn hình trong một màn hình. Nếu bạn có một màn hình máy tính để bàn mở rộng có thể chỉ bao gồm các hình chữ nhật "một phần" bên trong hình chữ nhật trên màn hình lớn. Ngay cả khi họ không thể bao gồm tất cả các khu vực máy tính để bàn (hai màn hình trong đường chéo bằng ví dụ), do đó bạn phải tìm hình chữ nhật máy tính để bàn lớn và thiết lập kích thước bằng tay. – helios

1

Đó là hành vi bình thường khi bạn phóng to cửa sổ trong Windows khi bạn có hai màn hình. Để có được kích thước phân giải đầy đủ, bạn sẽ cần phải xem GraphicsConfiguration để kiểm tra từng GraphicsDevice.

3

Đây không phải là những gì "setFullScreenWindow" là dành cho. Nó thực sự dành cho các ứng dụng muốn truy cập trực tiếp hơn vào bộ đệm khung (hiệu năng tốt hơn) - ví dụ như trò chơi 3D trong DirectX chẳng hạn. Loại này ngụ ý MỘT màn hình.

Xem câu trả lời này khác mà tôi đã làm: JDialog Not Displaying When in Fullscreen Mode

0

Sử dụng java.awt.Toolkit bạn có thể nhận được kích thước màn hình đầy đủ (tất cả màn hình):

Toolkit tk = Toolkit.getDefaultToolkit(); 
    Dimension dim = tk.getScreenSize(); 
+2

Từ kinh nghiệm của tôi, đó không phải là tất cả sự thật. Nếu bởi tất cả các màn hình bạn có nghĩa là toàn bộ kích thước máy tính để bàn, đó là. Tôi nhận được kích thước trên một trong các màn hình với điều này, cụ thể hơn màn hình chính của tôi. – andersoyvind

17

Một giải pháp tổng quát hơn để mã Ash là để công đoàn các giới hạn của tất cả các cấu hình đồ họa

Rectangle2D result = new Rectangle2D.Double(); 
GraphicsEnvironment localGE = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
for (GraphicsDevice gd : localGE.getScreenDevices()) { 
    for (GraphicsConfiguration graphicsConfiguration : gd.getConfigurations()) { 
    result.union(result, graphicsConfiguration.getBounds(), result); 
    } 
} 
f.setSize(result.getWidth(), result.getHeight()); 

Điều này sẽ hoạt động cho các màn hình được căn chỉnh theo chiều dọc cũng như ngang.

Các vấn đề liên quan