我尝试实现一种机制,该机制将防止在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);
}
希望这会帮助你。
问候,
马里斯