Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java WindowEvents从何处启动?_Java_Swing - Fatal编程技术网

Java WindowEvents从何处启动?

Java WindowEvents从何处启动?,java,swing,Java,Swing,我有一个非常奇怪的问题,我的应用程序中的一个窗口(我们称之为“窗口a”)总是将自己(或被放置)在将其拉出的窗口(“窗口B”)后面。即使我点击窗口A,窗口B也会立即再次出现 代码中没有任何明显的信息说明为什么会发生这种情况。我可以写一个windowActivated()或windowDeactivated(),但是当它们被调用时,关于谁真正切换了窗口的信息当然早已不存在了 我怎样才能到达触发这些事件的点呢?我已经找到了导致错误的原因,我想我会把它发布在这里,以防它对其他人有用。我从来没有找到我最初

我有一个非常奇怪的问题,我的应用程序中的一个窗口(我们称之为“窗口a”)总是将自己(或被放置)在将其拉出的窗口(“窗口B”)后面。即使我点击窗口A,窗口B也会立即再次出现

代码中没有任何明显的信息说明为什么会发生这种情况。我可以写一个
windowActivated()
windowDeactivated()
,但是当它们被调用时,关于谁真正切换了窗口的信息当然早已不存在了


我怎样才能到达触发这些事件的点呢?

我已经找到了导致错误的原因,我想我会把它发布在这里,以防它对其他人有用。我从来没有找到我最初问题的答案,我仍然认为它很可能已经向我展示了bug的来源。这当然不是显而易见的

事实证明,如果您有一个自定义的焦点遍历策略(
Container.setFocusTraversalPolicy(FocusTraversalPolicy)
)及其
getFirstComponent()
传回一个不可聚焦的组件[*],那么无论何时以编程方式或由用户将窗口带到前面,它将在z顺序层次结构中返回一步

我通过一个好的旧暴力发现了这个问题:有问题的窗口是继承层次结构的一部分,如下所示:

  AbstractSuperclass
      /      \
     /        \
BuggyWindow  NonBuggyWindow
我制作了一个
ToyWindow
类,也是从
AbstractSuperclass
派生而来的。它没有虫子。我费力地从
BuggyWindow
复制代码,直到出现错误。这是在第一次显示窗口时调用的长方法中;通过连续删除,我找到了有问题的代码块,其中许多小部件的
isEditable()
isEnabled()
设置为false。由于其他窗口禁用了所有的窗口小部件(在视图模式下),显然还有更多的功能。然后我想起了自定义焦点遍历策略

我编写了一个包含重要元素的玩具程序,能够可靠地触发bug。我在自定义焦点遍历策略中为所有方法添加了焦点可用性检查。小虫,再见

感谢那些回复我的人,我为缺乏信息表示歉意。我不想把大量的代码推给你,浪费人们的时间。这意味着你没有得到你在这里习惯的东西,这是不幸的


[*]我将非聚焦视为
!(isFocusable()&&isEnabled())
,因为我无法快速获得足够的信息来准确了解组件何时可以聚焦但未启用(或者相反),这对于我来说已经足够好了。(哦,我多么希望JRE的评论比例如“isFocusable()返回此组件是否可以聚焦”…“isEnabled()返回此组件是否已启用”-@#&$!!!)

因为我看不到任何研究成果,我建议谷歌“Java EventListener”。您是否已将
始终设置为top
或调用
toFront
requestFocus
或其任何变体?@chade,我不知道EventListener会为我做什么。我确实有WindowListeners,但正如我所说的,我所需要的信息在调用它们时早已消失。我需要知道是谁触发了这些事件。@MadProgrammer,我已经找过了。我也非常确信是窗口A请求在窗口B后面,因为即使它是从窗口C或菜单栏菜单项调用的,也会发生这种情况。不,在我的整个代码库中没有toBack()调用。“代码中没有明显的东西…”什么代码?为了更快地获得更好的帮助,请发布一个or。