Bom dia,
Possuo uma interface que irá disparar uma operação que poderá levar alguns minutos.
Para indicar ao usuário que o sistema esta ocupado optei por utilizar o Progress Bar. Esse progress bar foi adicionado em uma janela modal que é aberta assim que a operação é iniciada.
A primeira vista esta funcionando conforme eu queria, porém após alguns segundos (enquanto a operação é feita e a barra esta sendo incrementada), a primeira janela fica disponível para clique, possibilitando ao usuário clicar no X e fechar o sistema no meio da operação.
Isso é um bug da API ou estou utilizando o Progress bar de maneira errada?
public class Operation {
private int cont = 0;
//Imagine aqui um método que realiza uma operação longa
//e que durante sua execução serão feitos os incrementos
//na barra de progresso
public void operation(ProgressBar bar){
while(cont < 100){
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
//incrementa a barra de progresso
bar.setSelection(cont);
cont ++;
System.out.println(cont);
}
}
}
public class TesteUI {
private Button btnPrint;
private Display display;
private Shell shell;
public static void main(String[] args){
new TesteUI().createUI();
}
public Display getDisplay() {
return display;
}
public void setDisplay(Display display) {
this.display = display;
}
public void createUI() {
display = new Display();
shell = new Shell();
shell.setText("Teste Barra de Progresso");
Composite mainComposite = new Composite(shell, SWT.NULL);
GridLayout mainLayout = new GridLayout(2,true);
GridData mainGrid = new GridData();
mainGrid.widthHint = 600;
mainGrid.heightHint = 400;
mainComposite.setLayoutData(mainGrid);
mainComposite.setLayout(mainLayout);
btnPrint = new Button(mainComposite, SWT.None);
btnPrint.setText("Imprimir");
btnPrint.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent arg0) {
display.asyncExec(new VerifyProgressBar(new Operation()));
}
@Override
public void widgetDefaultSelected(SelectionEvent arg0) {
display.asyncExec(new VerifyProgressBar(new Operation()));
}
});
mainComposite.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
}
public class VerifyProgressBar implements Runnable {
private Operation operation;
public VerifyProgressBar(Operation operation) {
super();
this.operation = operation;
}
@Override
public void run() {
Shell shell = new Shell(Display.getCurrent(), SWT.BORDER | SWT.TITLE
| SWT.SYSTEM_MODAL);
shell.setText("Barra de Progresso");
Composite mainComposite = new Composite(shell, SWT.NULL);
GridLayout mainLayout = new GridLayout(1,true);
mainComposite.setLayout(mainLayout);
ProgressBar importProgressBar = new ProgressBar(mainComposite, SWT.SMOOTH);
importProgressBar.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
importProgressBar.setMaximum(100);
importProgressBar.setMinimum(0);
mainComposite.pack();
shell.open();
operation.operation(importProgressBar);
shell.close();
}
}