Página Inicial > Tutoriais > ProgressBar–Utilizando o recurso de barras de progresso do Next

ProgressBar–Utilizando o recurso de barras de progresso do Next

21, junho, 2012

O Next oferece um recurso de barra de progresso através da tag <n:progressbar>. O programador não precisa lidar com as funcionalidades AJAX envolvidas nesse processo. Nesse tutorial é mostrado um exemplo de utilização dessa tag.

A funcionalidade da barra de progressos pode ser dividida conceitualmente em três partes:

  • Um objeto da interface ProgressTask que representa a tarefa a ser executada.
  • A exibição para o usuário, criada através da tag <n:progressbar>.
  • E o modelo, representado pela interface IProgressMonitor,  que é atualizado pela tarefa e exibido pelos componentes gerados pela tag.
    O resultado final da barra de progresso é mostrado abaixo:
    progressbar

O primeiro passo para se utilizar a barra de tarefas é criar a tarefa. Uma tarefa é uma classe que implementa a interface ProgressTask. Essa interface define apenas um método run que deve conter o algoritmo de execução da tarefa. O código abaixo mostra um exemplo de tarefa utilizando uma classe anônima.

ProgressTask tarefa = new ProgressTask() {
public void run(IProgressMonitor progressMonitor) throws Exception {
// aqui vem o código da tarefa
}
};

O método run recebe como parâmetro um IProgressMonitor. Através desse objeto é possível atualizar o estado da tarefa. O primeiro passo para inicialização da tarefa é chamar o método beginTask, que recebe o nome da tarefa e a quantidade de trabalhos que essa tarefa irá executar. Se uma tarefa irá iteragir em 50 elementos, é interessante chamar o beginTask com o valor de 50. Exemplo:

progressMonitor.beginTask(“Iniciando progresso”, 50);

Para cada etapa da tarefa cumprida, chama-se o método worked, passando como parâmetro a quantidade de trabalho realizado. Exemplo:

progressMonitor.worked(1);

Com a tarefa criada é possível criar a parte visual da barra de progressos. A barra de progressos e a tarefa utilizam o mesmo objeto  IProgressMonitor para se manterem sincronizadas. Um objeto IProgressMonitor deve ser conseguido através da classe ProgressTaskFactory. O exemplo abaixo mostra como conseguir um IProgressMonitor para uma tarefa.

IProgressMonitor progressMonitor = ProgressTaskFactory.startTask(tarefa);

Esse progressMonitor deve ser salvo no request, e então utilizado pela tag <n:progressbar> no JSP, como mostra o exemplo abaixo:

<n:progressBar progressMonitor=”${progressMonitor}”/>

Veja o código fonte das classes para mais informações sobre a barra de progresso. Um objeto da interface ProgressTask não pode acessar o request quando uma tarefa é executada. Por isso, todas as informações que a tarefa irá precisar devem ser capturadas do request antes de a tarefa ser inicializada.

O exemplo abaixo mostra o código completo de um controller e um JSP que utilizam a barra de progresso.

Controller

package org.next.example.progressbar;

import org.nextframework.controller.Controller;
import org.nextframework.controller.DefaultAction;
import org.nextframework.controller.MultiActionController;
import org.nextframework.progress.IProgressMonitor;
import org.nextframework.progress.ProgressTask;
import org.nextframework.progress.ProgressTaskFactory;

@Controller(path="/site/progressbar")
public class ProgressBarExample extends MultiActionController {

@DefaultAction
public String index(){
/**
* Tarefa que será utilizada em conjunto com a barra de progresso
*/
ProgressTask tarefa = new ProgressTask() {
public void run(IProgressMonitor progressMonitor) throws Exception {
//dentro do método run deve ser executado o trabalho
//o objeto progressMonitor permite a atualização da etapa atual do trabalho (isso será refletido na tela)

progressMonitor.subTask("Trabalhando"); //nome que aparece abaixo da barra de progresso

progressMonitor.beginTask("Iniciando progresso", 100); //nome da tarefa sendo executada (aparece como um bullet)
for (int i = 0; i < 100; i++) {
Thread.sleep(50);
progressMonitor.worked(1);
if(((int)(Math.random()*100)) == 1){
//erro aleatório
throw new RuntimeException("Erro aleatório");
}
}

progressMonitor.setTaskName("Completo!"); //altera o nome da tarefa sendo executada (adicionando um bullet)
progressMonitor.subTask("");
}
};

IProgressMonitor progressMonitor = ProgressTaskFactory.startTask(tarefa);

setAttribute("progressMonitor", progressMonitor);

return "progressbar";
}
}
Java2html

JSP

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="n" uri="next"%>
<%@ taglib prefix="t" uri="template"%>


<t:tela titulo="Exemplo Progress Bar">
<!-- Cria a barra de progresso e já inicializa o processo no servidor -->
<n:progressBar progressMonitor="${progressMonitor}"
onComplete="alert('Completo '+element.done);"
onError="alert('Ocorreu um erro em '+element.percentDone+'%');"/>
</t:tela>
Java2html

Categories: Tutoriais Tags: ,
Os comentários estão fechados.