java swing 防抖机制
2016-02-29 17:45
375 查看
从问题开始说.
我们产品的 操作台(workbench) 是一个java swing程序. 有一个event handler的代码如下:
现在的一个问题在于, 如果用户连续点了两次button, 则event handler被执行两次, 则用户会得到 主键重复错误.
简单的想法是 在event handler的开头结尾把 对应的ok button给disable/enable.
但上面这段代码是错误的.
event dispatch thread的工作流程:
enter handling code of event1 -> disable button -> enable button -> enter handling code of event2
正确的实现:
event dispatch thread的工作流程:
enter handling code of event1 -> disable button -> ignore event2 -> enable button
If invokeLater is called from the event dispatching thread -- for example, from a JButton's ActionListener -- the doRun.run() will still be deferred until all pending events have been processed.
references:
https://docs.oracle.com/javase/tutorial/uiswing/concurrency/ https://docs.oracle.com/javase/7/docs/api/javax/swing/SwingUtilities.html#invokeLater(java.lang.Runnable)
我们产品的 操作台(workbench) 是一个java swing程序. 有一个event handler的代码如下:
public void actionPerformed(ActionEvent e) { // 做耗时的工作, 如插入数据库 }
现在的一个问题在于, 如果用户连续点了两次button, 则event handler被执行两次, 则用户会得到 主键重复错误.
简单的想法是 在event handler的开头结尾把 对应的ok button给disable/enable.
public void actionPerformed(ActionEvent e) { try { // disable OK 按钮... // 做耗时的工作 } finally { // enable OK 按钮... } }
但上面这段代码是错误的.
event dispatch thread的工作流程:
enter handling code of event1 -> disable button -> enable button -> enter handling code of event2
正确的实现:
public void actionPerformed(ActionEvent e) { try { // disable OK 按钮... // 做耗时的工作 } finally { SwingUtilities.invokeLater(new Runnable(){ @Override public void run() { // enable OK 按钮... }}); } }
event dispatch thread的工作流程:
enter handling code of event1 -> disable button -> ignore event2 -> enable button
If invokeLater is called from the event dispatching thread -- for example, from a JButton's ActionListener -- the doRun.run() will still be deferred until all pending events have been processed.
references:
https://docs.oracle.com/javase/tutorial/uiswing/concurrency/ https://docs.oracle.com/javase/7/docs/api/javax/swing/SwingUtilities.html#invokeLater(java.lang.Runnable)
相关文章推荐
- Java线程同步简单总结
- Java容器类简单总结
- java中堆和栈的分析
- localhost: Error: JAVA_HOME is not set.
- POJ 1054 Java: The Troublesome Frog
- eclipse创建webservice简单教程
- Java枚举详解
- @Scheduled(cron="") spring定时任务时间设置
- 【慕课笔记】第六章 JAVA中的集合框架(下) 第2节 学生选课——判断Set中课程是否存在
- Java ServletContext 详解
- java.lang.NoClassDefFoundError: Could not initialize class java.awt.Toolkit异常的解决方法
- java中的内部类总结
- java泛型
- java Timer
- 【Dubbo】Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- Struts2的声明式异常处理
- Java线程池《ThreadPoolExecutor中策略的选择与工作队列的选择》
- maven,spring,mybatis集成错误
- 老李分享:JAVA性能监控工具
- spring拦截器登录