2009-08-08 39 views
10

Tôi có một Java MouseListener trên một thành phần để phát hiện máy ép chuột. Làm thế nào tôi có thể cho biết màn hình nào khi nhấn chuột xảy ra?Làm thế nào để xác định màn hình nào mà sự kiện chuột Swing xảy ra?

@Override 
public void mousePressed(MouseEvent e) { 
    // I want to make something happen on the monitor the user clicked in 
} 

Hiệu ứng tôi cố gắng đạt được là: khi người dùng nhấn nút chuột trong ứng dụng của tôi, cửa sổ bật lên hiển thị một số thông tin, cho đến khi chuột được nhả ra. Tôi muốn đảm bảo cửa sổ này được định vị nơi người dùng nhấp vào, nhưng tôi cần điều chỉnh vị trí cửa sổ trên màn hình hiện tại để hiển thị toàn bộ cửa sổ.

+0

Tôi không chắc chắn nó phải là dễ dàng. Tôi nghĩ rằng bạn phải nắm bắt chuột để xem bất kỳ nhấp chuột bên ngoài cửa sổ của bạn, và tôi không có ý tưởng làm thế nào để làm điều đó trong java (Do đó nhận xét - Tôi không có "Trả lời"). –

+1

Bill, bạn nói đúng, nó không phải là dễ dàng. Đó là lý do tại sao tôi yêu cầu bộ não tập thể là Stack Overflow! –

Trả lời

13

Bạn có thể nhận thông tin hiển thị từ java.awt.GraphicsEnvironment. Bạn có thể sử dụng thông tin này để nhận thông tin về hệ thống cục bộ của mình. Bao gồm các giới hạn của mỗi màn hình.

Point point = event.getPoint(); 

GraphicsEnvironment e 
    = GraphicsEnvironment.getLocalGraphicsEnvironment(); 

GraphicsDevice[] devices = e.getScreenDevices(); 

Rectangle displayBounds = null; 

//now get the configurations for each device 
for (GraphicsDevice device: devices) { 

    GraphicsConfiguration[] configurations = 
     device.getConfigurations(); 
    for (GraphicsConfiguration config: configurations) { 
     Rectangle gcBounds = config.getBounds(); 

     if(gcBounds.contains(point)) { 
      displayBounds = gcBounds; 
     } 
    } 
} 

if(displayBounds == null) { 
    //not found, get the bounds for the default display 
    GraphicsDevice device = e.getDefaultScreenDevice(); 

    displayBounds =device.getDefaultConfiguration().getBounds(); 
} 
//do something with the bounds 
... 
+0

Đây là một nửa giải pháp, và nó đã giúp tôi giải quyết toàn bộ giải pháp. Cảm ơn! –

+0

Đó là, và tôi đã bình chọn bạn! –

0

Có thể e.getLocationOnScreen(); sẽ làm việc? Nó chỉ dành cho java 1.6.

1

Kể từ Java 1.6, bạn có thể sử dụng getLocationOnScreen, trong các phiên bản trước, bạn phải có được vị trí của các thành phần đó tạo ra sự kiện:

Point loc; 
// in Java 1.6 
loc = e.getLocationOnScreen(); 
// in Java 1.5 or previous 
loc = e.getComponent().getLocationOnScreen(); 

Bạn sẽ phải sử dụng lớp GraphicsEnvironment để có được những ràng buộc của màn hình .

2

Rich trả lời giúp tôi tìm một giải pháp toàn:

public void mousePressed(MouseEvent e) { 
    final Point p = e.getPoint(); 
    SwingUtilities.convertPointToScreen(p, e.getComponent()); 
    Rectangle bounds = getBoundsForPoint(p); 
    // now bounds contains the bounds for the monitor in which mouse pressed occurred 
    // ... do more stuff here 
} 


private static Rectangle getBoundsForPoint(Point point) { 
    for (GraphicsDevice device : GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()) { 
     for (GraphicsConfiguration config : device.getConfigurations()) { 
      final Rectangle gcBounds = config.getBounds(); 
      if (gcBounds.contains(point)) { 
       return gcBounds; 
      } 
     } 
    } 
    // if point is outside all monitors, default to default monitor 
    return GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds(); 
} 
+0

Nếu bạn muốn có màn hình mặc định, hãy xem câu trả lời cập nhật của tôi, trên các hệ thống đa màn hình, nơi Windows sẽ được căn giữa trên tất cả các màn hình, getMaximumWindowBounds() trả về các giới hạn của toàn bộ vùng hiển thị *. –

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