java Swing侦听器:组件相互侦听
我想对两个JList(类别和项目)进行编码。当我单击一个类别时,它应选择该类别的所有项目,当我单击一个项目时,它应选择其类别。因此,双方都将有一个相互倾听和改变选择 我应该担心某种“循环”吗?有没有办法判断某个事件已被消费?人们如何处理这种情况java Swing侦听器:组件相互侦听,java,swing,events,event-handling,jlist,Java,Swing,Events,Event Handling,Jlist,我想对两个JList(类别和项目)进行编码。当我单击一个类别时,它应选择该类别的所有项目,当我单击一个项目时,它应选择其类别。因此,双方都将有一个相互倾听和改变选择 我应该担心某种“循环”吗?有没有办法判断某个事件已被消费?人们如何处理这种情况 谢谢看这张照片。这里有一个针对NetBeans的建议。两个侦听器是实现这一点的好方法,不用担心。只要确保只创建一次侦听器,而不是在循环中。正如您所想象的,每次在listA上进行选择时,您都会触发一个ListSelectionEvent对您的listA侦听
谢谢看这张照片。这里有一个针对NetBeans的建议。两个侦听器是实现这一点的好方法,不用担心。只要确保只创建一次侦听器,而不是在循环中。正如您所想象的,每次在
listA
上进行选择时,您都会触发一个ListSelectionEvent
对您的listA
侦听器触发,其任务是在listB
中找到所有合适的项进行选择。然后在listB
上强制选择将触发事件由listB
侦听器处理。这将反过来强制选择listA
。仅仅使用两个侦听器并不能解决问题
我看到两种选择:
1-使用单个侦听器。此侦听器需要使用ListSelectionEvent
上的getSource
方法测试事件源。如果源是listB
,请从listA
的listenerlist中删除您的侦听器,强制选择listA
,然后读取
list1.removeListSelectionListener(this);
list1.setSelectedIndex(e.getFirstIndex()); //this would have to be played with to allow for intervals
list1.addListSelectionListener(this);`
2-使用两个侦听器,但是,为了避免循环,您需要在尝试选择该项之前测试该项是否已被选中。如果已选择,则不要重新选择 检查你的焦点在哪里。如果您的侦听器侦听组件A,而焦点不在A上,则不要更新其他组件,因为A不是用户更改的组件。否-焦点不是一个好标志(f.i.选择可能以编程方式进行…)在他的情况下不是。我认为依靠焦点是实现这一点的好方法,而不需要任何不必要的开销。他说的是“在comp X中做点什么”=>“更新Y”。他没有提到以编程方式更改这些组件。耸耸肩-你可以自由地坚持自己的错误,毕竟,当你遭受如此短视的编码后果时,这将是你的痛苦;-)再一次,他没有提到以编程方式改变事情。您可以根据需要编写动态代码,但在本例中不需要。但我能理解这不是最干净的解决方案。接受的答案也不是完美的,因为对于N个组件,您需要删除N-1个侦听器,然后读取它们。你认为那干净吗?