2011-05-22 166 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處理。檢查相關操作。

相關問題