gpt4 book ai didi

java - 在多显示器环境中将窗口完全放置在屏幕上

转载 作者:行者123 更新时间:2023-12-01 14:01:04 25 4
gpt4 key购买 nike

有时,我必须显示与现有组件相关的弹出窗口或对话框(主要示例是旁边带有日历按钮的日期输入控件)。

它多年来一直运行良好,但始终存在日历可能部分显示在屏幕之外的错误(它被硬编码为仅显示在字段的右侧)。只是没有人注意到,因为窗口最右侧从来没有日期控件。最近随着新窗口的添加,情况发生了变化。

那么,我想,让我们修复一个窗口位置(在我将其放置在应该的位置之后)以完全在屏幕上。我编写了一个简单的实用方法来做到这一点:

public static void correctWindowLocationForScreen(Window window) {
GraphicsConfiguration gc = window.getGraphicsConfiguration();
Rectangle screenRect = gc.getBounds();
Rectangle windowRect = window.getBounds();
Rectangle newRect = new Rectangle(windowRect);
if (windowRect.x + windowRect.width > screenRect.x + screenRect.width)
newRect.x = screenRect.x + screenRect.width - windowRect.width;
if (windowRect.y + windowRect.height > screenRect.y + screenRect.height)
newRect.y = screenRect.y + screenRect.height - windowRect.height;
if (windowRect.x < screenRect.x)
newRect.x = screenRect.x;
if (windowRect.y < screenRect.y)
newRect.y = screenRect.y;
if (!newRect.equals(windowRect))
window.setLocation(newRect.x, newRect.y);
}

问题已解决。或不。我使用触发组件(显示日历的按钮)中的屏幕坐标来定位窗口:

JComponent invoker = ... // passed in from the date field (a JButton)
Window owner = SwingUtilities.getWindowAncestor(invoker);
JDialog dialog = new JDialog(owner);
dialog.setLocation(invoker.getLocationOnScreen());
correctWindowLocationForScreen(dialog);

如果“调用者”组件位于跨越两个屏幕的窗口中,就会发生严重破坏。显然,“window.getGraphicsConfiguration()”返回窗口左上角所在的任何图形配置。这不一定是窗口中日期组件所在的屏幕。

那么在这种情况下如何正确定位对话框呢?

最佳答案

可以遍历所有设备,找到该点所在的监视器。然后保留该矩形。

参见GraphicsEnvironment.getScreenDevices .

这不会使用当前窗口,但您已经发现一个窗口可能会显示在多个监视器中。

有用的可能是Component.getLocationOnScreen .

关于java - 在多显示器环境中将窗口完全放置在屏幕上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19348044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com