2011-05-22 154 views
3

我一直在做JFrame的一点点,并且自从我开始使用Mouselistener(或任何事件列表器)以来,事情会平稳运行大约2分钟左右。然后我会得到大量的重复错误,程序仍然可以运行,但我可以使用任何事件侦听器。错误基本上是这样的: ...在AWTEventMulticaster.mouseEntered()中导致无限递归的原因是什么?

(无法赶上及时顶线,但像在线程异常“的AWT - EventQueue的 - 0” java.lang.StackOverflowError的) (后面)

at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:282) 
    at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:282) 
    at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:282) 
    at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:282) 
    at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:282) 
    at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:282) 
    at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:282) 
    at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:282) 
    at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:282) 
    at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:282) 
    at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:282) 
... 

重复数百行,其中mouseEntered可以是任何事件列表。

我已经花了很多时间检查所有整数,看看它们是否过高(发现一个,修复它,仍然发生)。我也到处检查了一个可以调用自己的值,但这没什么意义,因为它发生在2分钟内。

我不认为与任何特定的代码有关,只是告诉我它是什么意思,以及如何解决它。

+2

如果您可以发布'MouseListener'的代码以及如何使用它,这将有所帮助。 – 2011-05-22 21:08:18

+1

'我不认为是与任何特定的代码有关 - 你怎么知道这一点?你采取了哪些调试步骤来证明这一说法?在那之前,你有一个纯粹而简单的错误,代码将帮助我们解决它。所有的Swing代码都在EDT上被调用?有递归吗?编辑:事实上,我会假定有递归进行,无论你看不到。你的代码再次为我们回答这个问题。 – 2011-05-22 21:12:32

+0

好的,...我想你已经解决了这个问题。祝你好运。 – 2011-05-22 22:24:16

回答

0

如上所述,您的代码中存在一个纯粹且简单的错误,直到您向我们显示此代码,我怀疑除猜测之外我们可以做任何事情。话虽如此,我的SWA猜测是您正在进行递归,可能在不知不觉中,可能是通过从MouseListener本身中向GUI组件添加MouseListener。

无论如何,请自己和我们所有人帮忙,并显示相关的代码,因为我们大多数人都不喜欢猜测。

1

我想这最可能的原因是你已经把一个组件(直接或间接)。

0

我有一个类似的情况,虽然问题可能会更好地表达,但它帮助我,因为Hovercraft [^ s] +?s提供了一个很好的提示(递归)。

这样的问题可能无法用简单的代码隔离。至少在我的情况下,它发生在一个复杂的应用程序中,包含许多嵌套的Swing组件,包括JInternalFrames,包装在专有类中等。

在我们的案例中,尚未完全解决,我们对鼠标监听器(在面板的每个组件上添加很多处理相同的上下文菜单而不是进行全局管理),并根据用户操作添加和删除监听器。
无论如何,我怀疑在某个地方我们添加了很多听众(真的很多!),但没有正确删除它。在正常的操作中,我们不必删除它们,当组件被处置时它会自动完成,但是在这里添加和添加监听器而不处理组件。堆栈溢出可能只是一个非常深的堆栈迭代...

我正在分析代码以避免所有这些无用的侦听器添加(也许检测它是否存在之前添加?)。无论如何,上述分析对于有类似案例的人来说很有可能是有用的,所以我把它公开在那里。

0

我有同样的问题... 在我的代码,并将动态删除鼠标侦听对象实例,但它做错了...... 的后果是,你描述产生同样的错误。 一旦删除添加和删除鼠标监听器,一切都恢复正常操作。 显然,解决这个问题的方法是正确添加和删除监听器。

八卦自动化。

0

在我的经验反复添加一个给定的控件给同一个父母,然后调用doLayout()可以导致与AWTEventMulticaster stackoverflow,但这可能只是一个特定的Java版本中的错误。 (jdk_1.6.18) 而这个重新添加操作可能看起来是无稽之谈,但却是重用组件的副作用。

AWTEventMulticaster用于传播控制移动/调整大小和KeyEvent处理。检查相关操作。

相关问题