سؤال

لدي الرمز التالي يضيف actionlistener إلى jtextfield:

chatInput.addMouseListener(new java.awt.event.MouseAdapter() {
    public void mouseClicked(java.awt.event.MouseEvent evt) {
       chatInputMouseClicked(evt);
    }
});

الآن كيف يمكنني إزالة هذا mouselistener باستخدام chatInput.removeMouseListener(), ، لأن هذه الوظيفة تحتاج إلى حجة؟

هل كانت مفيدة؟

المحلول

يمكنك النظر في 3 طرق:

1) احفظ المرجع إلى المستمع قبل إضافته حتى تتمكن من إزالته لاحقًا:

MouseListener ml = new MouseAdapter() {
    public void mouseClicked(java.awt.event.MouseEvent evt) {
        chatInputMouseClicked(evt);
    }
};
chatInput.addMouseListener (ml);
...
chatInput.removeMouseListener (ml);

2) يمكنك الحصول على جميع مستمعي الأحداث المعينين مع أساليب المراسلة مثل:

public MouseListener[] getMouseListeners()  

أو

public EventListener[] getListeners(Class listenerType)

وهنا Javadocs ل أول و ثانيا أساليب. إذا تمكنت من التعرف على جميع المستمعين الذين تريد إزالته أو إذا كنت ترغب في إزالة جميع المستمعين ، فقد يساعد هذا النهج.


3) يمكنك استخدام بعض المتغيرات المنطقية التي ستؤدي إلى "إيقاف" المستمع. ولكن يجب أن تلاحظ أن المتغير يجب أن يكون حقلًا للطبقة الخارجية:

private boolean mouseListenerIsActive;

public void doSmthWithMouseListeners () {
    mouseListenerIsActive = true;

    chatInput.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent evt) {
            if (mouseListenerIsActive) {
               chatInputMouseClicked(evt);
            }
        }
    });
}

public void stopMouseListner () {
    mouseListenerIsActive = false;
}

أفضّل الشخص الثالث لأنه يعطي بعض المرونة ، وإذا أردت تشغيل مستمع الماوس مرة أخرى ، فلن أحتاج إلى إنشاء كائن جديد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top