Как перехватить / перенаправить событие MouseWheel на несколько объектов?

#java #swing #mousewheel #yfiles

#java #качать #mousewheel #yfiles

Вопрос:

Я использую библиотеку yFiles и обрабатываю объект Graph2DView с именем view . Чтобы активировать прокрутку mouseWheel для этого объекта, я должен добавить слушателя в функцию registerViewListeners. Тем не менее, я также хочу получать уведомления и в mouseWheelMoved функции MyClass, когда mouseweel

 public class MyClass extends MyBaseClass implements MouseWheelListener {
    
    Graph2DView view;  
    // ..... 

    @Override
    protected void registerViewListeners()   
    {  
         Graph2DViewMouseWheelScrollListener wheelListener = new Graph2DViewMouseWheelScrollListener();
         wheelListener.addToCanvas(view);
    
         // The two precedent instruction is equivalent to 
         // view.getCanvasComponent().addMouseWheelListener(this);
    }

    @Override
    public void mouseWheelMoved(MouseWheelEvent e) 
    {    
        // some work ...
    }  
}  
 

Проблема:
Если я зарегистрирую свой view объект через registerViewListeners

  @Override
 protected void registerViewListeners()   
 {  
    Graph2DViewMouseWheelScrollListener wheelListener = new Graph2DViewMouseWheelScrollListener();
    wheelListener.addToCanvas(view);
 }
 

Моя mouseWheelMoved функция больше не уведомляется:

 @Override
public void mouseWheelMoved(MouseWheelEvent e) 
{    
    // not called
}  
 

Комментарии:

1. Как вы регистрируете экземпляр MyClass ? Вы говорите, что вы вызываете view.getCanvasComponent().addMouseWheelListener(new MyClass()) , и ваш mouseWheelMoved единственный тогда не вызывается, когда вы дополнительно регистрируете прослушиватель по умолчанию?

2. @Sebastian Спасибо. У MyClass есть main функция. В этой основной функции я создаю экземпляр MyClass, в этом экземпляре я создаю JFrame, инициализирую все свои данные …. и в КОНЦЕ я регистрирую своих слушателей, вызывая registerViewListeners() . wheelListener.addToCanvas(view) возьмите все MouseWheel_Events, и mouseWheelMoved () функция MyClass больше не уведомляется

Ответ №1:

Ваше описание звучит так, как будто вы просто удалили регистрацию для вашего прослушивателя событий.

В том месте, где вы создаете экземпляр MyClass , пожалуйста, также добавьте:

  view.getCanvasComponent().addMouseWheelListener(myClassInstance); // register listener
 

Конечно, если вы не зарегистрируете своего слушателя, он не будет вызван. Только его создания будет недостаточно.

Комментарии:

1. это работает, спасибо. не могли бы вы объяснить мне, пожалуйста, почему это работает? теперь я должен добавить это в свою основную функцию (myClassInstance является экземпляром MyClass) MyClassInstance.view.getCanvasComponent().addMouseWheelListener(MyClassInstance);

2. Я не понимаю, какое объяснение вы ищете: если вы не зарегистрируете своего слушателя, как его вообще следует вызывать? Это не связано с yFiles. Если вы не добавите прослушиватель нажатия кнопки к кнопке, он также не будет вызван.

3. да, я понимаю, спасибо, но почему, когда я не вызываю wheelListener.addToCanvas(view); функцию mouseWheelMoved MyClass, она хорошо уведомляется?

4. Я просто не верю, что это тоже сработает. Скорее, я предполагаю, что у вас были закомментированные строки, которые делают точно то же самое, что я предлагал 🙂