Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在使用JavaSWT单击对话框时停止鼠标单击_Java_Swt_Jface - Fatal编程技术网

如何在使用JavaSWT单击对话框时停止鼠标单击

如何在使用JavaSWT单击对话框时停止鼠标单击,java,swt,jface,Java,Swt,Jface,我有一个对话框,当用户单击对话框中的ok按钮时,调用从客户端转到服务器,然后开始处理。同时,当它处于处理阶段时,当用户尝试单击对话框上的任何位置时,它将被挂起,然后一旦进程完成,它将正常运行。所以,在这个过程完成之前,我不希望用户点击对话框,即使他点击了这个事件也不应该被检测到,对话框也不应该被挂起 我不想使用进度监视器,是否有任何方法来处理此问题 这是我按下OK按钮后使用的代码 `//Server call startServerProcess(compsTable); //Async to

我有一个对话框,当用户单击对话框中的ok按钮时,调用从客户端转到服务器,然后开始处理。同时,当它处于处理阶段时,当用户尝试单击对话框上的任何位置时,它将被挂起,然后一旦进程完成,它将正常运行。所以,在这个过程完成之前,我不希望用户点击对话框,即使他点击了这个事件也不应该被检测到,对话框也不应该被挂起

我不想使用进度监视器,是否有任何方法来处理此问题


这是我按下OK按钮后使用的代码

`//Server call
startServerProcess(compsTable); 
//Async to update UI 
Display.getDefault().asyncExec( new Runnable() 
{ 
    public void run() 
    { 
        label.setText("");
    }
 });`

即使使用了异步调用,当用户单击对话框中的任意位置时,它也会显示挂起并表示没有响应。有什么帮助吗?——

除非您以异步方式执行,否则它的行为将与之类似。SWT正在等待,直到它从服务器获得响应为止,在此期间,您所做的任何操作(例如单击或执行其他操作)都不会产生任何影响,因为它尚未准备好进行用户交互


您可以在线程中运行作业,但ProgressMonitor的设计目的是为您提供一个良好的模式UI对话框,告诉您等待。如果你运行一个单独的线程,你必须检查他们是否点击OK按钮两次,或者你留下的其他元素是否可以访问。

我认为ergonaut的答案是正确的,你应该使用线程和异步处理

parent.setEnable(false);
send(message)
process(recv());
parent.setEnable(true);
但是如果你坚持要在一个UI中完成它!然后线程禁用对话框父组合、发送、接收和处理服务器的响应。然后启用父复合。这将在处理过程中阻止不必要的事件

parent.setEnable(false);
send(message)
process(recv());
parent.setEnable(true);

请注意,用户希望在处理某些内容时收到某种通知。在不显示应用程序正忙的情况下,用户可能会假设应用程序挂起并终止它。

这只是SWT、SWT+JFace还是Eclipse插件?这是SWT+JFace。我通过扩展org.eclipse.jface.dialogs.dialog创建了自己的对话框;通过使用WizardDialog的向导执行此操作,您可以访问进度监视器,该监视器处理在工作运行时禁用对话框控件的问题。Greg,您可以将WizardDialog与进度监视器一起使用,但用户要求不使用进度监视器。我需要在不使用进度监视器的情况下实现这一点。不使用进度监视器意味着您将不得不花费大量时间复制监视器所做的事情。我尝试在服务器调用开始时使用异步,但它显示线程访问无效。请给我一些时间,我将向您发布代码。将您的服务器连接代码放入AsyncExec的另一个线程和更新UI这是我在按下OK后使用的代码//服务器调用开始ServerProcessCompstable//异步更新UI Display.getDefault.asyncExec new Runnable{public void run{label.setText;};即使使用了异步调用,当用户单击对话框中的任意位置时,它也会显示挂起并表示没有响应。有什么帮助吗?@ergonaut..我已经更新了问题中的代码..你能检查一下并帮我解决问题吗..@ergonaut..问题从我这边还没有解决..有什么帮助来解决问题..我已经用我正在使用的代码更新了我的问题.用户不希望收到任何通知。在服务器处理完成且没有任何错误后,对话框应关闭。您的应用程序将冻结,一些用户将终止它。当然,除非你认识所有的用户。