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

时间:2010-01-26 03:32:39

标签: java swing events combobox

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

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

有没有办法阻止这种情况?

2 个答案:

答案 0 :(得分:1)

来自Swing tutorial

  

组合框还会生成项目事件,当任何项目的选择状态发生变化时会触发这些事件。

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

当您的软件调用setSelectedIndex()时,您可能不希望调用此方法中的actionPerformed()方法。您可能需要一个布尔eventInitiatedBySoftware。在你的主要(这个)课程中,你可以说

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

}

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

顺便说一句,你可能会误解事件概念。例如,我怀疑你实际上是将“this”添加为每个组合框的事件监听器,而不是将组合框添加为“this”的监听器。您可能希望查看Writing Event Listeners曲目。

答案 1 :(得分:1)

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