1

我需要在启动时修复 OSX(https://sourceforge.net/projects/ipscan/)上开源 Java 应用程序“Angry IP Scanner”的屏幕位置。

如果您启动应用程序并将其移动到辅助显示器(非镜像)的扩展空间并执行以下两项操作之一:1)在应用程序运行的情况下拔下辅助显示器或 2)退出位于辅助显示器上的应用程序监视器。

如果您拔下第二台显示器然后启动应用程序,应用程序会加载并将屏幕放置在现在不存在的第二台显示器上,即使它没有插入。

要让屏幕回到主屏幕区域,您必须插入第二台显示器并将其移回主屏幕。然后您可以拔下第二台显示器并且没有问题。

当应用程序启动时,我认为应用程序需要检查当前屏幕尺寸与之前的屏幕尺寸,如果它发生了变化,请将屏幕放在 10,10 位置附近,以便它显示在主屏幕上,希望是活动屏幕。

在我对 Stack Overflow 的搜索中,您似乎可以找到如下所示的当前屏幕信息:

GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
int width = gd.getDisplayMode().getWidth();
int height = gd.getDisplayMode().getHeight();

如何将其保存到文件中并调用/比较以前的数据与当前数据,如果它已更改,请将应用程序的窗口移动到 10,10 位置?

我是在 OSX 上编写 iOS 和 Ruby 的初学者,但没有做过任何 Java。我喜欢这个程序,但是这个错误让我很生气,而且似乎没有人在积极地处理代码。

有人想帮忙吗?

顺便说一句...这是 Angry IP Scanner 网站上的错误 84。

也许有人可以解释我如何从 cli 运行以下代码片段?

int resolution =Toolkit.getDefaultToolkit().getScreenResolution();
System.out.println(resolution);

谢谢,

帕帕帕

4

2 回答 2

2

就像是:

public class ShowMeTheScreenSize {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                System.out.println("VirtualBounds = " + getVirtualBounds());

                for (int index = 0; index < getScreenDeviceCount(); index++) {
                    System.out.println("[" + index + "] Device bounds = " + getScreenDeviceBounds(index));
                }

                System.exit(0);
            }
        });
    }

    public static int getScreenDeviceCount() {

        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();

        return ge.getScreenDevices().length;

    }

    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;

    }

    public static Rectangle getScreenDeviceBounds(int index) {

        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice lstGDs[] = ge.getScreenDevices();

        return lstGDs[index].getDefaultConfiguration().getBounds();

    }
}

哪个输出...

VirtualBounds = java.awt.Rectangle[x=0,y=0,width=3840,height=1200]
[0] Device bounds = java.awt.Rectangle[x=0,y=0,width=1920,height=1200]
[1] Device bounds = java.awt.Rectangle[x=1920,y=0,width=1920,height=1200]

在我的机器上

于 2012-12-11T02:09:26.960 回答
1

正如这里所讨论的,Mac OS X 有助于防止可见窗口被移出屏幕。一种权宜之计是将窗户移动到禁止位置的命令,这将迫使它伸手可及。

polo.setLocation(Short.MIN_VALUE, Short.MIN_VALUE);
于 2012-12-11T03:14:31.047 回答