2012-09-17 9 views
5

Sto provando a cambiare il cursore quando avvio un'operazione. Voglio che il cursore mostri occupato fino al termine dell'operazione. Ho una classe separata per OperationListener. Non sono sicuro di come assegnare il cursore?SWT - Mostra un cursore occupato

chiamata dalla classe AplotBaseDialog

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

classe separata

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() 

risposta

4

Questo funziona per me:

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

Basta impostare il cursore del vostro guscio che contiene tramite setCursor(Display, int).

Se non si desidera modificare il cursore per l'intera shell, utilizzare uno Composite o Control di propria scelta.


Ricordati che devi dispose() ogni Cursor esempio creato da voi.

+0

Fondamentalmente ho aggiunto le linee precedenti al mio metodo operativo come è iniziato subito prima che la finestra di dialogo fosse aperta e sembra funzionare. Vorrei davvero aver capito come farlo funzionare nella classe di operazioni astratte. Ma questo sembra avere lo stesso effetto. - Grazie – jkteater

4

Si potrebbe utilizzare

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

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

Ho provato a metterlo nel mio pulsante azione, ma non ha fatto nulla. Si prega di vedere sopra – jkteater

+0

potresti pubblicare quello che stai facendo in startPrinterListOperation()? Vedi qualche eccezione? –

+0

Nessuna eccezione - vedere il codice sopra – jkteater