2017-01-27 18 views
0

В netbeans для компонента автоматически создается прослушиватель мыши.Удаление прослушивателя мыши в netbeans

private void initComponents() { 
    jLabel9 = new javax.swing.JLabel(); 

    jLabel9.setBackground(new java.awt.Color(150, 192, 206)); 
    jLabel9.setOpaque(true); 
    jLabel9.setPreferredSize(new java.awt.Dimension(150, 150)); 
    jLabel9.addMouseListener(new java.awt.event.MouseAdapter() { 
     public void mouseClicked(java.awt.event.MouseEvent evt) { 
      jLabel9MouseClicked(evt); 
     } 
     public void mouseEntered(java.awt.event.MouseEvent evt) { 
      jLabel9MouseEntered(evt); 
     } 
     public void mouseExited(java.awt.event.MouseEvent evt) { 
      jLabel9MouseExited(evt); 
     } 
    }); 

Проблема в том, как удалить этот прослушиватель для события с щелчком мыши через функцию? Я пытаюсь сделать что-то вроде этого:

void rem(){ 
    jLabel9.removeMouseListener(new java.awt.event.MouseAdapter() { 
     public void mouseClicked(java.awt.event.MouseEvent evt) { 
      jLabel9MouseClicked(evt); 
     } 
    }); 
} 

Затем я вызываю эту функцию, как того требует мой программный поток. Но это не работает. Одна вещь, которую я понял (хотя я не уверен в этом) заключается в том, что это не работает, потому что я не удаляю слушателя через оригинальный адаптер. Вместо этого я создаю новый и пытаюсь удалить оригинальный прослушиватель. Я искал почти все действующие ссылки на google, но никто не помогает.

+0

Посмотрите на эту тему: http://stackoverflow.com/questions/2627946/how-to-remove-mouselistener-actionlistener-on-a-jtextfield –

+0

@ ZsoltÉbel Я уже видел, что , Если вы заметили, здесь создается, используется и затем удаляется новый адаптер мыши. Но моя ситуация другая. Я хочу удалить экземпляр уже созданного адаптера мыши. –

+0

Если вы хотите использовать метод грубой силы, 'JComponent' имеет метод getMouseListeners, который предоставит вам доступ ко всем слушателям, прикрепленным к компоненту, но я бы использовал его с осторожностью – MadProgrammer

ответ

1

Где ваша ссылка MouseListener? Вы используете анонимный MouseListener. Вы сами поняли, что вы удаляете новый MouseListener в своем методе removeMouseListener(). Зачем? Потому что вы больше не можете получить доступ к своему первоначальному слушателю. Создайте ссылку для нее, и ваша проблема будет решена.

MouseListener mListener = new MouseListener(new java.awt.event.MouseAdapter() { 
     public void mouseClicked(java.awt.event.MouseEvent evt) { 
      jLabel9MouseClicked(evt); 
     } 
     public void mouseEntered(java.awt.event.MouseEvent evt) { 
      jLabel9MouseEntered(evt); 
     } 
     public void mouseExited(java.awt.event.MouseEvent evt) { 
      jLabel9MouseExited(evt); 
     } 
    }); 



jLabel9.addMouseListener(mListener); 
jLabel9.removeMouseListener(mListener); 

Альтернативное решение, но первый из них намного проще:

MouseListener[] mListener = jLabel9.getMouseListeners(); 
for (MouseListener ml : mListener) { 
    jLabel9.removeMouseListener(ml); 
} 
+0

Thanx много ...! Хотя первый похож на то, что я нашел на других ссылках. Но это не сработает. Наверное, потому что у нас нет ссылки на оригинальный адаптер. Но ваше альтернативное решение работает просто отлично. –

+0

Можете ли вы также предложить способ удаления конкретного прослушивателя из многих других ... так как я хочу удалить только событие mouseClicked? –

+0

Слушатели - это интерфейсы, что означает, что они содержат абстрактные методы. Если вы реализуете интерфейс, вы должны реализовать его методы. Или вы должны объявить свой абстрактный класс и оставить его в подклассе для реализации отсутствующих методов. Таким образом, вы не можете удалить только метод mouseClicked, потому что ваш класс не будет соответствовать контракту интерфейса. –

0

Почти там, как Жолт Ebel сказал. класс Test {

JLabel jLabel9 = new JLabel(); 
MouseAdapter adapter = new MouseAdapter() { 
    public void mouseClicked(java.awt.event.MouseEvent evt) { 
     jLabel9MouseClicked(evt); 
    } 

    public void mouseEntered(java.awt.event.MouseEvent evt) { 
     jLabel9MouseEntered(evt); 
    } 

    public void mouseExited(java.awt.event.MouseEvent evt) { 
     jLabel9MouseExited(evt); 
    } 
}; 

private void initComponents() { 
    jLabel9 = new javax.swing.JLabel(); 

    jLabel9.setBackground(new java.awt.Color(150, 192, 206)); 
    jLabel9.setOpaque(true); 
    jLabel9.setPreferredSize(new java.awt.Dimension(150, 150)); 
    jLabel9.addMouseListener(adapter); 
} 

void rem() { 
    jLabel9.removeMouseListener(adapter); 
}