在我的代码中,两个组合框被添加到actionListener(this);
在我的代码的另一部分中,我调用了一个将索引设置为某个值的组合框函数。这又会再次调用actionPerfoemed,因此getSource == comboBox为true。每当我调用一个set函数时,它再次调用actionPerformed,创建一堆函数调用,然后向下展开到第一个。
有没有办法阻止这种情况?
答案 0 :(得分:1)
组合框还会生成项目事件,当任何项目的选择状态发生变化时会触发这些事件。
当用户使用鼠标单击项目或软件调用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。