SWT - Tweaking meu ProgressMonitorDialog
Eu tenho um trabalho ProgressMonitorDialog, mas eu quero ter certeza de que estou configurando corretamente.
Primeiro o código:
Método para criar o diálogo
public void startProgressBar() {
try {
new ProgressMonitorDialog(getShell()).run(true, true,
new ProgressBarThread());
}
catch (InvocationTargetException e) {
MessageDialog.openError(getShell(), "Error", e.getMessage());
}
catch (InterruptedException e) {
MessageDialog.openInformation(getShell(), "Cancelled", e.getMessage());
}
}
Arquivo de classe
class ProgressBarThread implements IRunnableWithProgress {
private static final int TOTAL_TIME = 1000;
public ProgressBarThread() {
}
public void run(IProgressMonitor monitor) throws InvocationTargetException,InterruptedException {
monitor.beginTask("Creating PDF File(s): Please wait.....", IProgressMonitor.UNKNOWN);
for (int total = 0; total < TOTAL_TIME ; total++) {
Thread.sleep(total);
monitor.worked(total);
if (total == TOTAL_TIME / 2) monitor.subTask("Please be patient... Operation should finish soon.");
}
monitor.done();
}
}
Método que chama ProgressBar e executa uma operação de criação de arquivo PDF
private void startSavePdfOperation() {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
startProgressBar();
}
});
saveOp = new AplotSaveOperation(appReg.getString("aplot.message.SAVETOPDF"), "PDF", session);
saveOp.addOperationListener(new MyOperationListener(this) {
public void endOperationImpl() {
java.io.File zipFile = null;
try {
AplotSaveResultsParser.SaveResult saveResults = saveOp.getSaveResults();
if (saveResults != null) {
ETC..... ETC......
Questões:
Sendo o ProgressMonitorDialog é uma GUI, ele precisa ser executado em um Display.getDefault (). AsyncExec?
Se o ProgressMonitorDialog está sendo executado em um segmento separado, como ele sabe para fechar quando a operação é finalizada?
Existe alguma relação entre a barra de progresso e a operação?
Estou correto em assumir que o loop for na classe ProgressBarThread é basicamente o temporizador que mantém o monitor aberto?
Existe uma maneira de aumentar a velocidade do indicador ProgressMonitorDialog, você também pode remover o botão de cancelamento?
Isso é o que estou pensando que está acontecendo atualmente.
Estou iniciando a barra de progresso antes de iniciar o PDF Operation ListenerVeja startSavePdfOperation () acima.
A barra de progresso está sendo executada como desconhecida, mas usando um loop for para manter a caixa de diálogo da barra de progresso aberta, enquanto a operação está sendo executada em um encadeamento em segundo plano.
Veja a classe ProgressBarThread acima
Quando a operação do PDF é concluída, a classe de operação do ouvinte fecha a caixa de diálogo da GUI base.
public void endOperation() {
try {
endOperationImpl();
}
finally {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
w.getShell().setCursor(new Cursor(Display.getCurrent(), SWT.CURSOR_ARROW));
w.recursiveSetEnabled(getShell(), true);
w.getShell().setEnabled(!getShell().getEnabled());
w.close();
}
});
}
}
Não tenho certeza do que está acontecendo com o monitor ProgressBarThread?
Isso é possível?
Quando a Operação PDF inicia, o ProgressMonitorDialog abre e inicia o indicador. OK, mantendo-o desconhecido.
Quando a Operação PDF é concluída, o monitor fecha e, em seguida, a caixa de diálogo base
Estou apenas querendo abrir o diálogo da barra de progresso que informará ao usuário que sua solicitação está funcionando em segundo plano.
Como afirmado o código acima funciona, mas eu tenho medo, deixando o fechamento da Base GUI, destruir o meu Progress Thread e Monitor não é uma boa prática.