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