2011-01-07 84 views
36

Tôi có cấu hình theo dõi kép và tôi muốn chạy GUI của mình trong một màn hình cụ thể nếu nó được tìm thấy. Tôi đã cố gắng để tạo ra cửa sổ JFrame của tôi đi qua một đối tượng GraphicConfiguration của thiết bị màn hình của tôi, nhưng nó không hoạt động, khung vẫn hiển thị trên màn hình chính.Hiển thị JFrame trên một màn hình cụ thể trong cấu hình màn hình kép

Làm cách nào để đặt màn hình nơi khung của tôi phải được hiển thị?

Trả lời

32
public static void showOnScreen(int screen, JFrame frame) 
{ 
    GraphicsEnvironment ge = GraphicsEnvironment 
     .getLocalGraphicsEnvironment(); 
    GraphicsDevice[] gs = ge.getScreenDevices(); 
    if(screen > -1 && screen < gs.length) 
    { 
     gs[screen].setFullScreenWindow(frame); 
    } 
    else if(gs.length > 0) 
    { 
     gs[0].setFullScreenWindow(frame); 
    } 
    else 
    { 
     throw new RuntimeException("No Screens Found"); 
    } 
} 
+3

Nhưng tại sao điều này liên quan đến "toàn màn hình"? Nếu tôi không cần sử dụng chế độ toàn màn hình thì sao? – Dims

+1

@Dims, tôi đã đưa ra một câu trả lời mới không ép buộc toàn màn hình. – ryvantage

1

Trải nghiệm của tôi là mở rộng máy tính để bàn trên nhiều màn hình, so với định cấu hình màn hình dưới dạng riêng biệt (X11) hiển thị. Nếu đó không phải là những gì bạn muốn làm, điều này sẽ không áp dụng.

Và giải pháp của tôi hơi bị hack: Tôi gọi là Toolkit.getScreenSize(), được xác định nếu tôi ở trong tình huống nhiều màn hình (bằng cách so sánh chiều cao với chiều rộng và giả sử chiều rộng> hai lần chiều cao được chỉ định nhiều màn hình), đặt vị trí X và Y ban đầu của khung.

+0

Cảm ơn bạn đã thích thú. Tôi đã giải quyết bằng cách sử dụng jframe.setBounds (graphicConfiguration.getBounds()) – blow

2

Vui lòng tham khảo API GraphicsDevice, bạn có một ví dụ điển hình ở đó.

28

tôi đã sửa đổi câu trả lời @ Joseph-Gordon để cho phép một cách để đạt được điều này mà không buộc toàn màn hình:

public static void showOnScreen(int screen, JFrame frame) { 
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    GraphicsDevice[] gd = ge.getScreenDevices(); 
    if(screen > -1 && screen < gd.length) { 
     frame.setLocation(gd[screen].getDefaultConfiguration().getBounds().x, frame.getY()); 
    } else if(gd.length > 0) { 
     frame.setLocation(gd[0].getDefaultConfiguration().getBounds().x, frame.getY()); 
    } else { 
     throw new RuntimeException("No Screens Found"); 
    } 
} 

Trong mã này tôi giả sử getDefaultConfiguration() sẽ không bao giờ trở về null. Nếu đó không phải là trường hợp thì ai đó hãy sửa tôi. Tuy nhiên, mã này hoạt động để di chuyển JFrame của bạn sang màn hình mong muốn.

+4

Giải pháp này chỉ hoạt động, nếu các thiết bị không được căn chỉnh theo chiều dọc. Thay thế 'frame.getY()' bằng 'gd [0] .getDefaultConfiguration(). GetBounds(). Y + frame.getY()' để sửa lỗi này. – Ercksen

0

Đối với tôi làm việc tốt cũng (giả màn trái có kích thước 1920x1200):

A) đặt trên màn hình bên trái trên một số vị trí chính xác:

newFrame.setBounds(200,100,400,200)

B) đặt trên màn hình ngay trên một số vị trí chính xác:

newFrame.setBounds(2000,100,200,100)

C) đặt trên màn hình rời được phóng to:

newFrame.setBounds(200,100,400,200) newFrame.setExtendedState(JFrame.MAXIMIZED_BOTH)

D) đặt trên màn hình ngay tối đa

newFrame.setBounds(2000,100,200,100) newFrame.setExtendedState(JFrame.MAXIMIZED_BOTH)

2

Một giải pháp sạch hơn nhiều sau khi đọc các tài liệu cho JFrame.setLocationRelativeTo hiển thị trên màn hình 2

public void moveToScreen() { 
    setVisible(false); 
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    GraphicsDevice[] screens = ge.getScreenDevices(); 
    int n = screens.length; 
    for (int i = 0; i < n; i++) { 
     if (screens[i].getIDstring().contentEquals(settings.getScreen())) { 
      JFrame dummy = new JFrame(screens[i].getDefaultConfiguration()); 
      setLocationRelativeTo(dummy); 
      dummy.dispose(); 
     } 
    } 
    setVisible(true); 
} 

Chức năng này có thể được sử dụng để chuyển đổi cửa sổ ứng dụng giữa các màn hình

+2

Cài đặt chính xác là gì? – Machado

0

Nhiều giải pháp ở đây hoạt động cho các màn hình mở rộng. Nếu bạn đang sử dụng các màn hình riêng biệt, chỉ cần truyền đối tượng cấu hình đồ họa của thiết bị đồ họa mong muốn đến hàm khởi tạo của jframe hoặc jdialog.

0

Câu trả lời của Vickys chứa con trỏ bên phải. Nó là JFrame mới (GraphicsConfiguration gc) thực hiện nó.

Bạn có thể làm điều đó như thế:

GraphicsDevice otherScreen = getOtherScreen(this); 
JFrame frameOnOtherScreen = new JFrame(otherScreen.getDefaultConfiguration()); 

private GraphicsDevice getOtherScreen(Component component) { 
    GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    if (graphicsEnvironment.getScreenDevices().length == 1) { 
     // if there is only one screen, return that one 
     return graphicsEnvironment.getScreenDevices()[0]; 
    } 

    GraphicsDevice theWrongOne = component.getGraphicsConfiguration().getDevice(); 
    for (GraphicsDevice dev : graphicsEnvironment.getScreenDevices()) { 
     if (dev != theWrongOne) { 
      return dev; 
     } 
    } 

    return null; 
} 
0

Nếu u muốn đặt nó vào trung tâm của màn hình bên trái:

int halfScreen = (int)(screenSize.width/2); 
       frame.setLocation((halfScreen - frame.getSize().width)/2, (screenSize.height - frame.getSize().height)/2); 

Nếu u muốn đặt nó vào trung tâm của màn hình bên phải:

int halfScreen = (int)(screenSize.width/2); 
       frame.setLocation((halfScreen - frame.getSize().width)/2 + halfScreen, (screenSize.height - frame.getSize().height)/2); 
0

Tôi đã sửa đổi câu trả lời @ Joseph-gordon và @ryvantage để cho phép một cách để đạt được điều này mà không buộc phải quét toàn bộ reen, màn hình cố định vị trí cấu hình và trung tâm nó trên màn hình chọn:

public void showOnScreen(int screen, JFrame frame) { 
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    GraphicsDevice[] gd = ge.getScreenDevices(); 
    int width = 0, height = 0; 
    if(screen > -1 && screen < gd.length) { 
     width = gd[screen].getDefaultConfiguration().getBounds().width; 
     height = gd[screen].getDefaultConfiguration().getBounds().height; 
     frame.setLocation(
      ((width/2) - (frame.getSize().width/2)) + gd[screen].getDefaultConfiguration().getBounds().x, 
      ((height/2) - (frame.getSize().height/2)) + gd[screen].getDefaultConfiguration().getBounds().y 
     ); 
     frame.setVisible(true); 
    } else { 
     throw new RuntimeException("No Screens Found"); 
    } 
} 
+0

Tham chiếu đến 'hiển thị' trên dòng 5 là không xác định. Điều này" nói đến cái gì? –

0

Với tất cả mọi người sứt mẻ với hương vị riêng của họ, dựa trên hương vị khác, tôi thêm tôi vì những người khác nhốt bạn trong liên quan đến định vị của cửa sổ trên màn hình đã chọn.

Nó chỉ đơn giản là tốt nhất. Nó cũng cho phép bạn thiết lập vị trí trên màn hình kia.

public void setLocation(int screen, double x, double y) { 
     GraphicsEnvironment g = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     GraphicsDevice[] d = g.getScreenDevices(); 

     if (screen >= d.length) { 
       screen = d.length - 1; 
     } 

     Rectangle bounds = d[screen].getDefaultConfiguration().getBounds(); 

     // Is double? 
     if (x == Math.floor(x) && !Double.isInfinite(x)) { 
       x *= bounds.x; // Decimal -> percentage 
     } 
     if (y == Math.floor(y) && !Double.isInfinite(y)) { 
       y *= bounds.y; // Decimal -> percentage 
     } 

     x = bounds.x  + x; 
     y = jframe.getY() + y; 

     if (x > bounds.x) x = bounds.x; 
     if (y > bounds.y) y = bounds.y; 

     // If double we do want to floor the value either way 
     jframe.setLocation((int)x, (int)y); 
} 

Ví dụ:

setLocation(2, 200, 200); 

Thậm chí cho phép bạn vượt qua trong một tỷ lệ phần trăm cho vị trí màn hình!

setLocation(2, 0.5, 0);  // Place on right edge from the top down if combined with setSize(50%, 100%); 

màn hình phải lớn hơn 0, mà tôi chắc chắn là một yêu cầu khó khăn!

Để đặt cuối cùng, chỉ cần gọi với Integer.MAX_VALUE. **

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