quinta-feira, 24 de setembro de 2009

Processamento assíncrono com SWT

Se quiser bombar uma thread no splash inicial, tem q usar a classe StartupRunnable para tal.

Em suma, cole essa meleca na tua classe que herde de AbstractSplashHandler e sempre que precisar atualizar a GUI assincronamente, use esse método


@SuppressWarnings("restriction")
private void updateUI(final Runnable r) {
Shell splashShell = getSplash();
if (splashShell == null || splashShell.isDisposed())
return;

Display display = splashShell.getDisplay();

if (Thread.currentThread() == display.getThread())
r.run();
else {
StartupRunnable startupRunnable = new StartupRunnable() {

public void runWithException() throws Throwable {
r.run();
}
};
display.asyncExec(startupRunnable);
}
}


Exemplo de chamada (estou atualizando uma ProgressBar fake ) :


private void fakeUpdate(final String message, final boolean increment) {

updateUI(new Runnable() {

public void run() {
if (getSplash().isDisposed())
return;
if (increment) {
progress.setSelection( progress.getSelection() + 1 );
}
if (message != null) {
notes.setText(message);
notes.update();
}
}
});

}


É meio sinistro (gera uns warnings logo no import), mas furunfa...