2009-09-22 48 views
1

我的自定义组件由JPanel中的三个JTree组成。一次只能选择一个JTree,所以我为其中的每个人添加了一个TreeSelectionListener,它们在先前选择的JTree上调用clearSelectionSwing:自定义组件上的听众执行顺序

我想添加其他TreeSelectionListener s到JTree s确保选择处理侦听器总是首先执行。我不想把所有内容都放在一个TreeSelectionListener之内。

我应该怎么办?提前致谢!

回答

3

也许你可以通过添加新的侦听器到现有的侦听器来进行链接,这样当下一次你的侦听器被调用时,它将依次将事件转发给它的侦听器。

// 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); 
      } 
    } 

} 
+0

谢谢,这是一个很好的解决方案!我不知道我怎么没有得到它之前:) BTW我有一个新的问题:/(http://stackoverflow.com/questions/1466042/swing-how-can-i-ignore-deselection-events) – Giuseppe 2009-09-23 13:37:08

+1

我很高兴这很有帮助。也许是因为有时候我们太集中于一个问题的观点,我们没有看到其他的选择。这经常发生在我身上。有时我们只需要一个不同的观点。 – OscarRyz 2009-09-23 15:21:44

1

不是一个很好的解决方案,但可以将代码包装在SwingUtilities.invokeLater(...)中。这会将代码添加到EDT的末尾,这意味着它将在其他侦听器代码执行后最终执行。