我的自定义组件由JPanel
中的三个JTree
组成。一次只能选择一个JTree
,所以我为其中的每个人添加了一个TreeSelectionListener
,它们在先前选择的JTree
上调用clearSelection
。Swing:自定义组件上的听众执行顺序
我想添加其他TreeSelectionListener
s到JTree
s确保选择处理侦听器总是首先执行。我不想把所有内容都放在一个TreeSelectionListener
之内。
我应该怎么办?提前致谢!
我的自定义组件由JPanel
中的三个JTree
组成。一次只能选择一个JTree
,所以我为其中的每个人添加了一个TreeSelectionListener
,它们在先前选择的JTree
上调用clearSelection
。Swing:自定义组件上的听众执行顺序
我想添加其他TreeSelectionListener
s到JTree
s确保选择处理侦听器总是首先执行。我不想把所有内容都放在一个TreeSelectionListener
之内。
我应该怎么办?提前致谢!
也许你可以通过添加新的侦听器到现有的侦听器来进行链接,这样当下一次你的侦听器被调用时,它将依次将事件转发给它的侦听器。
// 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);
}
}
}
不是一个很好的解决方案,但可以将代码包装在SwingUtilities.invokeLater(...)中。这会将代码添加到EDT的末尾,这意味着它将在其他侦听器代码执行后最终执行。
谢谢,这是一个很好的解决方案!我不知道我怎么没有得到它之前:) BTW我有一个新的问题:/(http://stackoverflow.com/questions/1466042/swing-how-can-i-ignore-deselection-events) – Giuseppe 2009-09-23 13:37:08
我很高兴这很有帮助。也许是因为有时候我们太集中于一个问题的观点,我们没有看到其他的选择。这经常发生在我身上。有时我们只需要一个不同的观点。 – OscarRyz 2009-09-23 15:21:44