Java 如何在多屏幕环境中知道JFrame是否在屏幕上

Java 如何在多屏幕环境中知道JFrame是否在屏幕上,java,swing,graphics,jframe,Java,Swing,Graphics,Jframe,我的应用程序用于多屏幕环境。应用程序在关闭时存储其位置,并从最后一个位置开始。 我通过调用frame.getLocation() 如果帧在主屏幕上或在主屏幕的右侧,这会给我一个正值。位于主屏幕左侧屏幕上的帧的X值为负值。 当屏幕配置更改时(例如,多个用户共享一个Citrix帐户并具有不同的屏幕分辨率),问题就会出现 我现在的问题是确定存储的位置是否在屏幕上可见。根据其他一些帖子,我应该使用GraphicsEnvironment来获得可用屏幕的大小,但我无法获得不同屏幕的位置 示例:getLoc

我的应用程序用于多屏幕环境。应用程序在关闭时存储其位置,并从最后一个位置开始。
我通过调用
frame.getLocation()
如果帧在主屏幕上或在主屏幕的右侧,这会给我一个正值。位于主屏幕左侧屏幕上的帧的X值为负值。
当屏幕配置更改时(例如,多个用户共享一个Citrix帐户并具有不同的屏幕分辨率),问题就会出现

我现在的问题是确定存储的位置是否在屏幕上可见。根据其他一些帖子,我应该使用
GraphicsEnvironment
来获得可用屏幕的大小,但我无法获得不同屏幕的位置

示例:
getLocation()
给出
点(-250,10)

GraphicsEnvironment
提供了
设备1宽度:1920
设备2宽度:1280

现在,根据屏幕的顺序(辅助监视器是放置在主监视器的左侧还是右侧),框架可能可见,也可能不可见。

你能告诉我怎么解决这个问题吗


非常感谢

这有点多余,但是,如果您只想知道框架是否在屏幕上可见,您可以计算桌面的“虚拟”边界,并测试框架是否包含在中

public class ScreenCheck {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setBounds(-200, -200, 200, 200);
        Rectangle virtualBounds = getVirtualBounds();

        System.out.println(virtualBounds.contains(frame.getBounds()));

    }

    public static Rectangle getVirtualBounds() {
        Rectangle bounds = new Rectangle(0, 0, 0, 0);
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice lstGDs[] = ge.getScreenDevices();
        for (GraphicsDevice gd : lstGDs) {
            bounds.add(gd.getDefaultConfiguration().getBounds());
        }
        return bounds;
    }
}
现在,这使用了框架的
矩形
,但是您可以使用它的位置


同样,您可以单独使用每个
图形设备
,然后依次检查每个设备…

这可能有助于其他人寻找类似的解决方案

我想知道我的swing应用程序位置是否有任何部分不在屏幕上。此方法计算应用程序的区域,并确定是否所有区域都可见,即使它被分割到多个屏幕上。当您保存应用程序位置,然后重新启动它,并且您的显示配置不同时,将提供帮助

public static boolean isClipped(Rectangle rec) {

    boolean isClipped = false;
    int recArea = rec.width * rec.height;
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice sd[] = ge.getScreenDevices();
    Rectangle bounds;
    int boundsArea = 0;

    for (GraphicsDevice gd : sd) {
        bounds = gd.getDefaultConfiguration().getBounds();
        if (bounds.intersects(rec)) {
            bounds = bounds.intersection(rec);
            boundsArea = boundsArea + (bounds.width * bounds.height);
        }
    }
    if (boundsArea != recArea) {
        isClipped = true;
    }
    return isClipped;
}

非常感谢,这帮了我的忙!这似乎有问题,因为屏幕区域可能不是矩形的。你如何判断某个应用程序是否位于你较小的屏幕上方,但仍低于你较大屏幕的顶部?但它仍然朝着正确的方向前进@BillK这需要你知道屏幕和它们的位置,一旦你有了每个屏幕的矩形边界,你就可以开始决定如何放置屏幕了out@BillK你可以看看哪个会生成屏幕布局的“虚拟”视图-一旦你有了矩形,你可以确定它们相对于每一个的位置,并决定你想做什么——然后问题就归结为基本几何