2012-09-17 185 views
5

我試圖改變光標當我開始操作。我希望光標顯示忙,直到操作完成。我有一個單獨的類爲operationListener。 我不知道如何分配光標?從AplotBaseDialog類SWT - 顯示忙碌光標

呼叫

listOp.addOperationListener(new MyOperationListener(this) { 
    etc.... 
} 

分層次

public abstract class MyOperationListener implements InterfaceAIFOperationListener { 
    Cursor busyCursor = null; 
    AplotBaseDialog w = null; 

    public MyOperationListener(AplotBaseDialog win) { 

    **Should this not be getCurrent?** 
    busyCursor = new Cursor(Display.getCurrent(), SWT.CURSOR_WAIT); 

    w = win; 
    } // end constructor 

    public void startOperation(String startMessage) { 
    ** should this be getting a Shell form the AplotBaseDialog? ** 
    w.???.setCursor(busyCursor); 

    } // end startOperation() 

    public void endOperation() { 
    try { 
     endOperationImpl(); 
    } 
    finally { 
     w.???.setCursor(null); 
    } 
    } // end endOperation() 

    abstract protected void endOperationImpl(); 
} // end class MyOperationListener 

EDIT

plotButton.addSelectionListener(new SelectionAdapter() { 
     public void widgetSelected(SelectionEvent e) { 
      BusyIndicator.showWhile(Display.getDefault(), new Runnable(){ 
       public void run(){ 
        startPrinterListOperation(); 
       } 
      }); 
     } 
    }); 

EDIT

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(); 
       } 
      }); 
     } 
     finally { 

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


} // end startPrinterListOperation() 

回答

4

這個工作對我來說:

private static boolean wait = false; 

private static Cursor cursor = null; 

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("Change cursor"); 

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

     @Override 
     public void handleEvent(Event arg0) { 
      wait = !wait; 

      if(cursor != null) 
       cursor.dispose(); 

      cursor = wait ? new Cursor(display, SWT.CURSOR_WAIT) : new Cursor(display, SWT.CURSOR_ARROW); 

      shell.setCursor(cursor); 
     } 
    }); 


    shell.setSize(200,200); 
    shell.open(); 
    while (!shell.isDisposed()) { 
     if (!display.readAndDispatch()) { 
      display.sleep(); 
     } 
    } 
    display.dispose(); 

    if(cursor != null) 
     cursor.dispose(); 
} 

通過setCursor(Display, int)只需設置你的殼含有的光標。

如果您不想更改整個外殼的光標,請使用您選擇的CompositeControl


請記住,你必須dispose()自己創建的每個Cursor實例。

+0

我基本上剛剛添加上述行到我的操作方法,因爲它開始然後就在對話框打開之前,它似乎工作。我真的希望我能想出如何使它在抽象操作類中工作。但是這似乎具有相同的效果。 - 謝謝 – jkteater

4

你可以使用

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

    public void run(){ 
     //your code 
    } 
    }); 
+0

我試圖把在我的按鈕動作,但它沒有做任何事情。請參閱上面 – jkteater

+0

你可以發佈你在startPrinterListOperation()中做什麼?你有沒有看到任何異常? –

+0

沒有例外 - 請參閱上面的代碼 – jkteater