我有一个Swing程序,它根据某些文本字段的内容和一对单选按钮(在按钮组中)的设置进行搜索。程序会自动搜索某些文本字段何时失去焦点。当失去焦点事件通过单击其中一个单选按钮触发时,问题就出现了。在单选按钮被选中()值更改之前,文本字段上的丢失焦点事件将得到处理,因此搜索将使用“错误”(即旧的)参数完成,而不是基于电台新设置的参数纽扣。如何等待单选按钮在丢失的焦点事件中被选中
我尝试使用我自己的invokeWhenIdle方法(如下所示)在事件队列稳定后运行搜索来调用搜索,但它仍然使用单选按钮的旧设置。
我唯一的工作解决方案是在运行搜索之前延迟250毫秒失去焦点事件,以便单选按钮有时间更改。这可以工作,但它会让UI显得呆滞。
有什么更好的点子?
public static void invokeWhenIdle(final int a_max_retry, final Runnable a_runnable) {
if (a_max_retry <= 0) {
throw new IllegalStateException("invokeWhenIdle: Could not run " + a_runnable);
}
// get the next event on the queue
EventQueue l_queue = Toolkit.getDefaultToolkit().getSystemEventQueue();
AWTEvent l_evt = l_queue.peekEvent();
if (l_evt == null) {
// nothing left on the queue (but us), we can do it
SwingUtilities.invokeLater(a_runnable);
} else {
// still something in the queue, try again
SwingUtilities.invokeLater(new Runnable() {
public void run() {
invokeWhenIdle(a_max_retry - 1, a_runnable);
}
});
}
}
那么有没有真正的方法知道什么时候应该运行搜索或何时应该等待,因为用户可能会点击一个单选按钮。您需要在用户上次击键后的一段时间内使用计时器来运行搜索,或者不要执行此操作,并让用户通过单击“搜索”按钮开始搜索。你不需要像这样玩'EventQueue' - 看看[如何使用Swing定时器](http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html)。当您检测到按键时,请重新启动计时器 –
我的解决方法是使单选按钮不可聚焦(setFocusable(false)),以便它们不会在文本字段上导致丢失的焦点事件。仍然好奇,如果有另一种解决方案。 – Mitch
您也不需要这样做,您可以使用连接到搜索字段上的按键的计时器。 –