是否有可能知道JFrame是否完全可见?

问题描述:

我只是试验JFrames,并想知道我的应用程序窗口是否完全可见或被其他应用程序窗口遮挡。另一个应用程序窗口可以是本机应用程序。如果可以,我可以检索不可见区域的大小和位置吗?是否有可能知道JFrame是否完全可见?

不,这是不可能的,因为你的Java应用程序只知道它的窗口内容,而没有别的。窗饰和屏幕的其余部分由操作系统管理。在像Linux这样的操作系统中,窗口管理器甚至是一个完全不同的用户空间进程。另一个本地应用程序也将在另一个用户空间进程中运行。

请问为什么要这么做?如果您询问刷新/重绘问题,则无需执行任何操作。您的操作系统有足够的智能,并且会在您的应用程序再次变为可见时要求您重新进行重新绘制。

+0

我正在考虑分层信息,z-顺序,一个特定的应用程序窗口。我的应用程序大小相同,部分透明,因此跟踪的窗口仍然可见。 如果跟踪窗口请求焦点我的窗口将被完全遮蔽,然后我可以调用toFront()再次显示它。但是,如果其他应用程序仅遮蔽了我窗口的某些部分,我知道这不是所请求关注的跟踪窗口。 我最初的想法是使用RepaintManager和getDirtyRegion()当我的窗口被停用,失去焦点。但我认为这也不行!? – kolten 2010-02-26 17:21:22

+0

使用GlassPane代替 - http://java.sun.com/docs/books/tutorial/uiswing/components/rootpane.html – Nate 2010-02-27 02:22:32

+0

Hi Nate!你能详细说明一下吗?我查看了文档,但无法看到如何以我想要的方式使用它。 – kolten 2010-02-27 09:18:11

这里是一个真是可恶做法,这是我能想到的(和不推荐)的唯一方法:

  • 设置你的JFrame的玻璃面板是完全红色,显示玻璃窗格(暂时)。
  • 使用Robot类从当前放置JFrame的屏幕坐标对所有像素(或多个像素)进行采样。
  • 如果您的所有样品(或根据某个阈值的大多数样品)均为红色,那么您的JFrame可能没有任何样品。
  • 最后,再次隐藏玻璃窗格。

替代(更好的解决方案)

直接让toFront()JFrame将其带到前面,确保它焦点。