Swing: порядок выполнения слушателей на пользовательском компоненте

Мой пользовательский компонент состоит из трех JTree внутри JPanel. Одновременно должен быть выбран только один JTree, поэтому я добавил TreeSelectionListener к каждому из них, который вызывает clearSelection для ранее выбранного JTree.

Я хотел бы добавить другие TreeSelectionListener к JTree, чтобы быть уверенным, что прослушиватели обработки выбора всегда выполняются первыми. Я бы предпочел не помещать все в один единственный TreeSelectionListener.

Что я должен делать? Заранее спасибо!


person Giuseppe    schedule 22.09.2009    source источник


Ответы (2)


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

// This is your current listener implementation
class CustomTreeSelectionListener implements TreeSelectionListener {

    // listeners to which the even will be forwarded
    private List<TreeSelectionListener> ownLIsteners;


    public void addListener( TreeSelectionListener newListener ) {
         ownListeners.add( newListener );
    }

    // add also removeListener( ....  ) 

    // TreeSelectionListener interface implementation...
    public void valueChanged( TreeSelectionEvent e ) {
           process( e ); // do what you do now

           // Forward the message.
           for( TreeSelectionListener listener : ownListeners ) {
                listener.valueChanged( e );
           }
    }

 }
person OscarRyz    schedule 22.09.2009
comment
Спасибо, это отличное решение! Интересно, как я не понял этого раньше :) Кстати, у меня новая проблема:/(stackoverflow.com/questions/1466042/) - person Giuseppe; 23.09.2009
comment
Я рад, что это было полезно. Может быть, потому, что иногда мы слишком сосредоточены на одном взгляде на проблему, что не видим других вариантов. Это случается со мной довольно часто. Иногда нам просто нужна другая точка зрения. - person OscarRyz; 23.09.2009

Не очень хорошее решение, но вы можете обернуть код в SwingUtilities.invokeLater(...). Это добавит код в конец EDT, что означает, что он в конечном итоге будет выполнен после выполнения другого кода прослушивателя.

person camickr    schedule 22.09.2009