Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java Swing侦听器:组件相互侦听_Java_Swing_Events_Event Handling_Jlist - Fatal编程技术网

java Swing侦听器:组件相互侦听

java Swing侦听器:组件相互侦听,java,swing,events,event-handling,jlist,Java,Swing,Events,Event Handling,Jlist,我想对两个JList(类别和项目)进行编码。当我单击一个类别时,它应选择该类别的所有项目,当我单击一个项目时,它应选择其类别。因此,双方都将有一个相互倾听和改变选择 我应该担心某种“循环”吗?有没有办法判断某个事件已被消费?人们如何处理这种情况 谢谢看这张照片。这里有一个针对NetBeans的建议。两个侦听器是实现这一点的好方法,不用担心。只要确保只创建一次侦听器,而不是在循环中。正如您所想象的,每次在listA上进行选择时,您都会触发一个ListSelectionEvent对您的listA侦听

我想对两个JList(类别和项目)进行编码。当我单击一个类别时,它应选择该类别的所有项目,当我单击一个项目时,它应选择其类别。因此,双方都将有一个相互倾听和改变选择

我应该担心某种“循环”吗?有没有办法判断某个事件已被消费?人们如何处理这种情况


谢谢

看这张照片。这里有一个针对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个侦听器,然后读取它们。你认为那干净吗?