我的应用程序用于多屏环境。应用程序在关闭时存储其位置并从最后一个位置开始。
我通过拨打
frame.getLocation()
获得职位
如果框架位于主屏幕上或位于主屏幕的右侧,这会给我一个正值。位于主屏幕左侧屏幕上的框架的 X 值为负值。GraphicsEnvironment
来获取可用屏幕的大小,但我无法获取不同屏幕的位置。
示例:
getLocation()
给出 Point(-250,10)
GraphicsEnvironment
给出 非常感谢
这是一个小补充,但是,如果您想知道框架是否在屏幕上可见,您可以计算桌面的“虚拟”边界并测试框架是否包含在其中。
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;
}
}
现在,这使用了框架的
Rectangle
,但您可以使用它的位置。
同样,您可以单独使用每个
GraphicsDevice
并依次检查每个...
这可能对其他正在寻找类似解决方案的人有帮助。
我想知道我的 swing 应用程序位置的任何部分是否在屏幕之外。此方法计算应用程序的区域并确定其是否全部可见,即使它分布在多个屏幕上。当您保存应用程序位置然后重新启动并且您的显示配置不同时会有所帮助。
public static boolean isClipped(Rectangle rec) {
int recArea = rec.width * rec.height;
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice sd[] = ge.getScreenDevices();
int boundsArea = 0;
for (GraphicsDevice gd : sd) {
Rectangle bounds = gd.getDefaultConfiguration().getBounds();
if (bounds.intersects(rec)) {
bounds = bounds.intersection(rec);
boundsArea = boundsArea + (bounds.width * bounds.height);
}
}
return boundsArea != recArea;
}