我尝试实现一种机制,该机制将防止在JComboBox上多次单击(我使用popupListeners)并为该事件侦听器执行该机制。

例如:

public class SomeClass{

 protected boolean semaphore = false;

 public void initComboBox() {

 JComboBox targetControllersComboBox = new JComboBox(); // combobox object
 targetControllersComboBox.addPopupMenuListener(new PopupMenuListener() {

        @Override
        public void popupMenuWillBecomeVisible(PopupMenuEvent event) {

            if (semaphore == false) {
                semaphore = true; // here acquired semaphor

                // HERE SOME CODE //

                semaphore = false; // here release semaphor
            }

         }
   }

}


我想避免在执行popupListener之前已经在运行代码之前在popupListener中运行代码。当popUplistener完成工作后,用户可以执行下一个popUplistener。不幸的是,我的例子并不能阻止这种情况。有人可以帮忙吗?我将竭尽所能。

更新:遵循(maris)重新解决问题:

        @Override
        public void popupMenuWillBecomeVisible(PopupMenuEvent event) {

                JComboBox comboBox = (JComboBox) event.getSource();
                comboBox.removePopupMenuListener(this);

                // some code ....
                // now Listener is disabled and user cant execute next listener until this listener not stop working


                comboBox.addPopupMenuListener(this); // after some code we add again listener, user now can use again listener

         }

最佳答案

通常,为了避免在事件处理过程中触发重复的事件,我们可以按照以下步骤操作:


使用小部件添加事件侦听器
触发事件后,请根据事件处理的请求删除事件侦听器
事件处理(业务逻辑)结束后,添加事件侦听器


我给出一个JButton的框架示例供您参考。

例如:

JButton submit = new JButton(...)
submit.addActionListener(this);
...

public void actionEvent(...) {
    // on submit clicked
    submit.removeActionListener();
    // do the business logic
    submit.addActionListener(this);
}


希望这会帮助你。

问候,

马里斯

10-05 19:13