Java-为什么组件函数调用actionPerformed?

Java-为什么组件函数调用actionPerformed?,java,swing,events,combobox,Java,Swing,Events,Combobox,在我的代码中,两个组合框被添加到actionListener(这个) 在代码的另一部分中,我调用了一个组合框函数,该函数将索引设置为某个值。这又会再次调用actionPerfoemed,因此getSource==comboBox为true。每次调用set函数时,它都会再次调用actionPerformed,创建一个函数调用堆栈,然后向下展开到第一个函数 有什么方法可以防止这种情况发生吗?从 组合框还生成项目事件,当任何项目的选择状态更改时,将触发这些事件 当用户用鼠标单击项目时,或当您的软件调用

在我的代码中,两个组合框被添加到actionListener(这个)

在代码的另一部分中,我调用了一个组合框函数,该函数将索引设置为某个值。这又会再次调用actionPerfoemed,因此getSource==comboBox为true。每次调用set函数时,它都会再次调用actionPerformed,创建一个函数调用堆栈,然后向下展开到第一个函数

有什么方法可以防止这种情况发生吗?

组合框还生成项目事件,当任何项目的选择状态更改时,将触发这些事件

当用户用鼠标单击项目时,或当您的软件调用setSelectedIndex()时,将生成这些事件

也许您不希望在软件调用setSelectedIndex()时调用此中的actionPerformed()方法。您可能需要由软件启动的布尔事件。在你的主课上,你可以说

synchronized(eventInitiatedBySoftware) {
  eventInitiatedBySoftware=true;
  comboboxeditor.setSelectedIndex(n);
}
然后在你的听众中:

public void actionPerformed(ActionEvent ae) {
synchronized(eventInitiatedBySoftware) {
  if (eventInitiatedBySoftware) {
    eventInitiatedBySoftware=false; // clear your flag.
    return; // don't want to process this event.
  }

  // the rest of your method goes here

}
当您的软件想要调整该值时,它会将布尔值设置为true。将调用actionPerformed方法,但您的测试将意识到此事件是由软件启动的,并在执行任何现有代码之前返回。它将清除布尔值,这样,如果用户现在使用鼠标执行选择操作,您的代码将意识到它不是由软件启动的


顺便说一句,你可能误解了事件的概念。例如,我怀疑您实际上是在为每个组合框添加“this”作为事件侦听器,而不是将组合框作为侦听器添加到“this”。您可能希望查看跟踪。

如果问题只是初始设置,您可以推迟添加侦听器,直到两者都已初始化。还有更多的讨论。

如果我没弄错的话,调用actionPerformed是命令模式的一部分。至于防止它,我不确定。你能把代码贴出来吗?听起来你不是在问命令模式,而是在问如何停止这一长串actionPerformed方法。是的,这正是正在发生的事情。谢谢你的链接。太好了!请考虑接受和/或投票表决。