2012-10-01 74 views
2

當我在後臺運行一個操作時,我將光標設置爲忙,直到進程完成。是否還有一種方法可以灰化並禁用當前的顯示/對話框/外殼,直到過程完成。我想通過視覺讓用戶知道某些內容正在工作,他們必須等待。運行打印機操作SWT - 灰掉並禁用當前shell

編輯

plotButton.addListener(SWT.Selection, new Listener() { 
     public void handleEvent(Event arg0) { 
     getShell().setEnabled(!getShell().getEnabled()); 
     getShell().setCursor(new Cursor(Display.getCurrent(), SWT.CURSOR_WAIT));  
     recursiveSetEnabled(getShell(), getShell().getEnabled()); 
     startPrinterListOperation(); <== This is method that runs operation 
     } 
    }); 

方法。

private void startPrinterListOperation() { 
    listOp = new AplotPrinterListOperation(appReg.getString("aplot.message.GETPRINTERLIST"), session); 
    listOp.addOperationListener(new MyOperationListener(this) { 
    public void endOperationImpl() { 
     try { 
      printers.clear(); 
      printers.addAll((ArrayList<PrinterProfile>) listOp.getPrinters()); 
      Display.getDefault().asyncExec(new Runnable() { 
       public void run() { 
       showAplotPlotterDialog(); <== When operation returns - opens selection dialog 
       } 
      }); 
     } 
     finally { 

      listOp.removeOperationListener(this); 
      listOp = null; 
     } 
    } 
    }); 
    session.queueOperation(listOp); 
} // end startPrinterListOperation() 

showAplotPlotterDialog()(獨立的類)打開與網絡打印機對話框,然後用按鈕按壓發送作業到選定的打印機。當該操作完成時,繪圖儀對話框關閉 - 這是該方法的結束 - baseDialog是主GUI

finally { 
      plotOp.removeOperationListener(this); 
      plotOp = null; 
      Display.getDefault().asyncExec(new Runnable() { 
       public void run() { 
       baseDialog.removeAllTableRows(); 
       baseDialog.plotRequestCompleted = true; 
       baseDialog.setResultsButtonVisibility(); 
       getShell().close(); 

       } 
      }); 
     } 
+0

當您的操作完成時,只需調用'recursiveSetEnabled(shell,true);'。 – Baz

+0

然後調用'getShell()。setEnabled(!getShell()。getEnabled());''。 – Baz

+0

是的 - 這很好用!謝謝BAZ – jkteater

回答

2

以下應該做你想要的。它會遞歸地禁用並灰掉您的Shell中的所有Control。該Shell本身不具有setGrayed方法,但是這將工作:

public static void main(String[] args) { 
    final Display display = new Display(); 
    final Shell shell = new Shell(display); 
    shell.setLayout(new FillLayout()); 

    Button button = new Button(shell, SWT.PUSH); 
    button.setText("Button"); 

    button.addListener(SWT.Selection, new Listener() { 

     @Override 
     public void handleEvent(Event arg0) { 
      shell.setEnabled(!shell.getEnabled()); 
      shell.setCursor(new Cursor(display, SWT.CURSOR_WAIT));  
      recursiveSetEnabled(shell, shell.getEnabled()); 
     } 
    }); 

    new Text(shell, SWT.NONE).setText("TEXT"); 

    shell.setSize(400, 400); 
    shell.open(); 

    while (!shell.isDisposed()) { 
     if (!display.readAndDispatch()) { 
      display.sleep(); 
     } 
    } 
    display.dispose(); 
} 

private static void recursiveSetEnabled(Control control, boolean enabled) { 
    if (control instanceof Composite) 
    { 
     Composite comp = (Composite) control; 

     for (Control c : comp.getChildren()) 
      recursiveSetEnabled(c, enabled); 
    } 
    else 
    { 
     control.setEnabled(enabled); 
    } 
} 
+0

上述代碼正在運行,直到操作完成。它永遠不會重新啓用殼牌。請參閱上面的編輯,我將解釋我是如何設置的。 – jkteater

+0

@jkteater當您的操作完成時,只需調用'recursiveSetEnabled(shell,true);'。 – Baz

1

使用

BusyIndicator.showWhile(Display.getDefault(), new Runnable() 
{ 

    public void run() 
    { 
     //operation 
    } 
}); 

它設置忙狀態光標上的所有Shell S(WindowDialog ,...)爲當前Display,直到執行Runnable.run()

0

巴茲的回答對我是一個很好的開始,但由於它延伸Composite不會對Combo行動。通過無條件撥打setEnabled,每個Control(包括Combo)被正確啓用/禁用。

private static void recursiveSetEnabled(Control control, boolean enabled) { 
    if (control instanceof Composite) 
    { 
     Composite comp = (Composite) control; 

     for (Control c : comp.getChildren()) 
      recursiveSetEnabled(c, enabled); 
    } 

    control.setEnabled(enabled); 
}