【发布时间】:2012-01-11 17:58:32
【问题描述】:
我有一个 Swing 程序,它根据一些文本字段的内容和一对单选按钮(在按钮组中)的设置进行搜索。当某些文本字段失去焦点时,程序将自动搜索。当单击其中一个单选按钮触发失去焦点事件时,问题就出现了。在单选按钮 isSelected() 值更改之前处理文本字段上的丢失焦点事件,因此使用“错误”(即旧)参数完成搜索,而不是基于单选的新设置的参数按钮。
我尝试使用我自己的 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- 查看How to Use Swing Timers。当您检测到击键时,重新启动计时器 -
我的解决方法是使单选按钮不可聚焦(setFocusable(false)),这样它们就不会导致文本字段失去焦点事件。仍然很好奇是否有其他解决方案。
-
您也不需要这样做,您可以使用连接到搜索字段上的击键的计时器。
-
但是触发搜索的不是搜索字段中的击键,而是该字段失去焦点时。
-
我认为也许你不应该开始搜索焦点丢失,因为它显然不适合你。也许最好让用户根据需要设置字段,然后按“提交”按钮。
标签: java swing awt-eventqueue