Java 如何禁用SWT selectionListener,直到完成一个单独的线程

Java 如何禁用SWT selectionListener,直到完成一个单独的线程,java,multithreading,swt,listener,Java,Multithreading,Swt,Listener,我有一个带有GUI线程和SQL线程的应用程序。GUI中显示了一个树,单击树中的一个项目将启动一个单独的线程,该线程将启动SQL查询。查询完成后,将更新树 问题是,如果用户在抓取线程完成之前再次单击树,则该树将在有机会完成数据抓取之前更新,并且该树将被错误地更新。有没有办法在启动另一个线程之前禁用侦听器,然后在线程完成后重新启用它,以防止虚假查询 private SelectionListener getTreeListener() { //main tr

我有一个带有GUI线程和SQL线程的应用程序。GUI中显示了一个树,单击树中的一个项目将启动一个单独的线程,该线程将启动SQL查询。查询完成后,将更新树

问题是,如果用户在抓取线程完成之前再次单击树,则该树将在有机会完成数据抓取之前更新,并且该树将被错误地更新。有没有办法在启动另一个线程之前禁用侦听器,然后在线程完成后重新启用它,以防止虚假查询

private SelectionListener getTreeListener() 
{               

    //main tree listener that populates folder and report objects on the left side of the SashForm
    SelectionListener l = new SelectionAdapter() 
    {


        @Override
        public void widgetSelected(SelectionEvent arg0) 
        {

            Thread runThread = new FetchTreeChildrenThread(_es,_mgr,_PAI,_PE,_SelectedPub,Selected_Tree_Item);
                    runThread.start();
        }
    }

}

您可以只跟踪您启动的线程,在前一个线程完成之前不启动另一个线程,而不必担心侦听器是否已启用


获取代码需要提供一个回调,该回调在查询完成后从“SQL线程”中调用

然后UI代码可以注册这样的回调,以便在执行查询后重新启用树

例如(在
widgetSelected
方法中):

Display Display=new Display();
Runnable uiUpdateCode=new Runnable(){
@凌驾
公开募捐{
如果(!tree.isDisposed()){
//重新附加选择列表器
}
}
};
Runnable doneCallback=new Runnable(){
@凌驾
公开募捐{
如果(!display.isDisposed()){
display.asynceec(uiUpdateCode);
}
}
};
threadbackgroundthread=新线程(new Runnable(){
@凌驾
公开募捐{
//…执行查询
doneCallback.run();
}
} );
backgroundThread.start();
注意,SWT只允许在UI线程上执行的代码操作小部件。因此,
display.asyncExec()
计划“在下一个合理的时机”在UI线程上执行给定的runnable


还请注意,在调用runnable时,可能已经处理了具有。因此,在访问小部件之前,有必要在runnable中检查此情况。

如果您觉得有答案解决了问题,请单击绿色复选标记将其标记为“已接受”。这有助于将注意力集中在仍然没有答案的老帖子上。
private SelectionListener getTreeListener() 
{
    //main tree listener that populates folder and report objects on the left side of the SashForm
    SelectionListener l = new SelectionAdapter()
    {
        private Thread runThread;

        @Override
        public void widgetSelected(SelectionEvent arg0)
        {
            if (runThread == null || (!runThread.isAlive()))
            {
                runThread = new FetchTreeChildrenThread(_es,_mgr,_PAI,_PE,_SelectedPub,Selected_Tree_Item);
                runThread.start();
            }
        }
    }
}