2010-04-24 83 views
3

我想编写两个JList(类别和项目)。当我点击一个类别时,应该选择该类别的所有项目,当我点击一个项目时,应该选择它的类别。所以JList将有一个ListSelectionListener相互倾听并更改选择。java Swing监听器:组件互相监听

我是否应该担心某种“回路”?有没有办法说明事件已被消耗?人们如何处理这种情况?

谢谢

回答

1

如你想象,每次进行选择上listA,你会触发一个ListSelectionEvent要对你的听众烧成listA,他们的工作是找到listB所有适当的项目进行选择。强制选择然后listB将触发事件由您的listB监听器处理。这将依次在listA上强制选择。简单地使用两个听众并不能解决问题。

我看到两个选项:

1 - 使用一个单一的监听器。该听众需要使用ListSelectionEvent上的getSource方法来测试事件的来源。如果源为listB,请将您的听众从listA的听众列表中删除,然后强行选择listA,然后再读取。

list1.removeListSelectionListener(this); 
list1.setSelectedIndex(e.getFirstIndex()); //this would have to be played with to allow for intervals 
list1.addListSelectionListener(this);` 

2 - 使用两个监听器,但是,为了避免循环,您需要在尝试选择它之前测试该项是否已被选中。如果它已被选中,不要重新选择它。

0

两位听众是如何做到这一点的好方法,不用担心。只要确保你只创建侦听器一次,而不是循环。

-1

检查你的焦点在哪里。如果侦听器侦听组件A并且焦点不在A上,则不要更新其他组件,因为A不是用户更改的组件。

+0

没有焦点不是一个好标志(f.i.选择可能会发生编程...) – kleopatra 2012-11-27 15:01:47

+0

不在他的情况。我认为依靠重点是一个很好的方式来实现这一点,没有任何不必要的开销。他在谈论“在comp X中做某件事”=>“更新Y”。他没有提及以编程方式更改这些组件。 – Timmos 2012-11-27 16:47:52

+0

耸耸肩 - 你可以自由地坚持你的错误,毕竟这将是_your_痛苦时,遭受代码如此短视的后果;-) – kleopatra 2012-11-27 17:00:13