伊莉討論區

標題: [求助]請問要如何重設監聽?[已解決] [打印本頁]

作者: ahway9988    時間: 2018-12-5 04:04 AM     標題: [求助]請問要如何重設監聽?[已解決]

我的問題是 有一個button 陣列 分別指向 某一類陣列class C

button[i].addMouseListener(new MyMouseListener(C[i]));




MyMouseListener 是我自訂的監聽類,裡面也有實作監聽介面該有的方法,如下

private class MyMouseListener implements MouseListener {
    private C c;

    //建構
    public MyMouseListener(C c) {
        this.c= c;

    }

    //
    public void mousePressed(MouseEvent me) {
        c.btnEvent();//呼叫了c的自訂事件方法
    }
}

這樣子看上去似乎沒有問題,一開始執行確實也都沒有問題
不過一但將c 陣列索引重新打散後,這樣的執行方法就會出錯了
它們的事件就指向不同的

以下是實測結果:

btn>>>>>>>>id:0 ; pd:手機 ; 12500
btn  each>>>>>>>> id:0 ; pd:手機 ; 12500
btn  each>>>>>>>> id:1 ; pd:摩托車 ; 38500
btn  each>>>>>>>> id:2 ; pd:書 ; 650
btn  each>>>>>>>> id:3 ; pd:null
btn  each>>>>>>>> id:4 ; pd:null

btn>>>>>>>>id:0 ; pd:null
btn  each>>>>>>>> id:1 ; pd:摩托車 ; 38500
btn  each>>>>>>>> id:2 ; pd:書 ; 650
btn  each>>>>>>>> id:0 ; pd:null
btn  each>>>>>>>> id:3 ; pd:null
btn  each>>>>>>>> id:4 ; pd:null


第一次刪除了"手機"
然後重新排列(排列規則是c類裡的pd屬性,因此這個屬性物件被設為null,而不是c被設為null)
第二次刪除了"摩托車"
不過按下後郤出現了null問題

以測試的數據來看,button[0]它仍指向 c[0] ,也就是上表出示的 id:0 ,那一筆是null ,並不是指向被重新排列後的新的c陣列

因此得重新設定它們的監聽

經過java se8 的文件求得解答:
MouseListener[] ml=button[i].getMouseListeners();
button[i].removeMouseListener(ml[0]);


button[i].addMouseListener(new MyMouseListener(c[i]));

也就是說要先將原有的監聽刪除後 才置換成新的監聽
在翻文件過程中,似乎它告訴我,其實add監聽 ml 是一個陣列,也就是我根本就不用另外再去設什麼需要傳參數的監聽
然後再讓它呼叫哪一個c的方法orz
因為直接就能按照i++ 去 add監聽了,但不知道我說對不對,也不知道要怎麼使用它們

希望有可以得補充一下這部份,或關於關於監聽更有用的做法
感謝orz



作者: jackyo04    時間: 2018-12-5 10:59 AM

雖然沒有實做過,但我應該會讓該陣列重新排序就好,當發現前面有null就去補它位置
應該是你沒做null的判斷,所以它連null都算進去了吧




歡迎光臨 伊莉討論區 (http://a04.eyny.com/) Powered by Discuz!