从哪个WindowEvents中解雇?

时间:2017-10-17 06:43:08

标签: java swing

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

代码中没有任何明显的信息可能会发生这种情况。我可以写一个windowActivated()windowDeactivated(),但是当他们被称为实际切换窗口的信息当然早已不复存在。

我怎样才能达到触发这些事件的程度?

1 个答案:

答案 0 :(得分:0)

我找到了导致这个错误的原因,并认为我会在这里发布它,以防它对别人有用。我从来没有找到我原来问题的答案,我仍然认为它可能已经告诉我这个bug的来源。肯定 非显而易见。

事实证明,如果你有一个自定义焦点遍历策略(Container.setFocusTraversalPolicy(FocusTraversalPolicy),它的getFirstComponent()会传回一个不可聚焦的组件[*],那么每当窗口以编程方式或由用户显示在前面,它将在z顺序层次结构中向后发送一步。

我通过良好的老暴力找到了问题:违规窗口是继承层次结构的一部分,如下所示:

  AbstractSuperclass
      /      \
     /        \
BuggyWindow  NonBuggyWindow

我创建了一个ToyWindow课,也来自AbstractSuperclass。它没有这个bug。我费力地从BuggyWindow的代码中复制,直到出现错误。这是一个很长的方法,在首次显示窗口时调用;通过连续删除,我到达了有问题的代码块,其中许多小部件将isEditable()isEnabled()设置为false。由于其他窗口都禁用了所有窗口小部件(在“查看”模式下),因此显然有更多窗口。然后我想起了自定义焦点遍历政策。

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

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

[*]因为我无法快速获得足够的信息来准确理解组件何时可以聚焦但未启用(或反过来),因此我无法将其作为!(isFocusable() && isEnabled())。对我的目的来说足够好了。 (哦,我希望JRE有更好的评论比例如“isFocusable()返回是否可以聚焦这个组件”...“isEnabled()返回是否启用了这个组件” - @#&amp; $ !!! )