我在对话框中有一个测试按钮,当用户点击该按钮时,我的应用程序将尝试通过JDBC连接到数据库。
对于某些测试用例这个工作例如,将花费很长时间来响应用户,网络连接超时。我这样做是通过将一个监听器附加到该按钮并连接到该监听器中的数据库。连接时,用户界面将不会响应,直到连接作业完成。连接完成后,任何用户操作都会生效。
例如:该对话框中有另一个“取消”按钮,单击此按钮将关闭对话框。如果在连接作业运行时单击“取消”按钮,则在连接作业完成之前,对话框不会关闭!
我希望在我的连接作业运行时发生用户操作被忽略,而不是存储并在以后生效。
我在Windows 7上使用eclipse indigo
我的问题应该是:
如何在后台运行作业时忽略任何用户的操作。
答案 0 :(得分:2)
到目前为止,作业在后台运行时,我发现忽略任何用户操作的两种方式:
第一个是在操作开始前调用shell.setEnabled(false)
,在操作完成后调用shell.setEnabled(true)
。
(可选)与BusyIndicator
结合使用,为用户提供一些反馈。
第二个是使用没有按钮的模态对话框,因此用户无法关闭它(例如SWT.APPLICATION_MODAL | SWT.SHEET | SWT.NO_TRIM
样式)。该对话框包含一个标签,例如“正在加载...”或ProgressBar
。使用RCP时,ProgressMonitorDialog
是一个选项。
在我的情况下,我不想使用第二种解决方案,因为我不知道后台作业运行了多长时间。如果作业很短,我想避免在ProgressMonitorDialog快速连续打开和关闭时出现一些闪烁。
@ screentiger.com我在文章中没有看到你分享了当作业在后台运行时如何忽略任何用户操作。 如果您可以更具体并且可能提供代码示例,我将不胜感激。
答案 1 :(得分:0)
swt中只有一个UI线程(也是大多数其他线程),您的编程方式会阻止UI。
对于你的工作,你需要创建一个新的线程来做它而不是那么长期的工作在UI线程中,使用1.5中的执行器介绍。
最好的方法是使用eclipse Job机制。您可以开始学习:http://www.eclipse.org/articles/Article-Concurrency/jobs-api.html我