【问题标题】:Progressbar don't work in primefaces进度条在 primefaces 中不起作用
【发布时间】:2013-12-26 16:28:13
【问题描述】:

我有一个文件上传按钮,当用户上传文件时,ManagedBean 中的进程开始。此过程可能非常缓慢,我需要向用户显示进度。所以我有以下代码:

<p:fileUpload id="commandButtonIniciarImportacao"
            disabled="#{importacaoArMB.produtoSelecionado == null}"
            fileUploadListener="#{importacaoArMB.uploadArquivoImportacao}"
            mode="advanced" auto="true" cancelLabel="Cancelar"
            update=":formManterArquivoImportacao:tabViewManterArquivoImportacao:dataTableArs,
            :formManterArquivoImportacao:tabViewManterArquivoImportacao:dataTableArsIgnorados"
            label="Iniciar Importação..."
            onstart="pbImportacao.start()" />

        <p:progressBar widgetVar="pbImportacao" ajax="true" value="#{importacaoArMB.progresso}" 
        labelTemplate="#{value}%">
        </p:progressBar>

在我的 managedBean 中,我有一个 getter 和 setter 来进行进度属性,我正在执行以下操作:

public void uploadArquivoImportacao(FileUploadEvent fileUploadedEvent) {

        if (produtoSelecionado == null) {
            addErrorMessage("Selecione o Produto antes de iniciar a importação");
            FacesContext.getCurrentInstance().validationFailed();
            return;
        }

        try {

            addInfoMessage("Iniciando importação ...");

            uploadedFile = fileUploadedEvent.getFile();

            // Inicializando atributos do bean (ArquivoImportacao)
            byte[] conteudoAsBytes = uploadedFile.getContents();
            bean.setConteudo(new String(conteudoAsBytes));
            bean.setDataHoraImportacao(new Date());
            bean.setNome(uploadedFile.getFileName());
            bean.setLayoutImportacao(produtoSelecionado.getLayoutImportacao());

            arsIgnorados = getBoPadrao().gerarArsFromImportacao(bean, progresso);

            addInfoMessage("Importação finalizada");

        } catch (BOException bo) {
            addErrorMessage(bo.getMessage());
            FacesContext.getCurrentInstance().validationFailed();
        } catch (Exception e) {
            e.printStackTrace();
            addErrorMessage(e.getMessage());
            FacesContext.getCurrentInstance().validationFailed();
        }

    }   

我将“progress”属性传递给我的 BO(业务对象),并且该属性的值在 FOR 的每个迭代器中递增。

问题是:progressBar 没有任何反应,从零继续。

【问题讨论】:

  • 在高级模式中已经包含每个上传文件的进度条。我看不到您如何更新 progresso 变量。您是否按照here 的描述设置了过滤器和过滤器映射?
  • 我会解释:
  • 好吧,我发现在 BO 中的所有进程结束后调用了“progressbar”,但我不知道为什么
  • 好吧,我明白了,问题是你不能在文件上传时启动你的第二个进程,因为它太早了(此时进度条还没有启动......)。再说一句:标签模板不是EL表达式,所以labelTemplate="{value}%"(这里不需要#)。
  • 但是我该如何解决这个问题呢?上传文件后,我需要启动另一个进程。

标签: java jsf primefaces


【解决方案1】:

看看这个用你的代码构建的例子。

这只是一个演示,但它正在按照你想要的方式工作!希望你能把它改编成你的真实代码。

<h:form id="form1">
<p:growl id="growl" showDetail="true"/>  
<p:fileUpload id="fileup1"
        fileUploadListener="#{uploadBean.uploadArquivoImportacao}"
        mode="advanced" 
        auto="true" 
        cancelLabel="Cancelar"
        update="growl"
        label="Iniciar Importação..."
        onstart="pbImportacao.start()" />
 <p:progressBar 
    id="progress1" 
    widgetVar="pbImportacao" 
    ajax="true" 
    value="#{uploadBean.progresso}" 
    labelTemplate="{value}%">
    <p:ajax event="complete" listener="#{uploadBean.onComplete}" update="growl" />
 </p:progressBar>
</h:form>       

在 UploadBean 类中:

public void uploadArquivoImportacao(FileUploadEvent fileUploadedEvent) {

    System.out.println("File uploaded...");

    //collects information about uloaded file here...

    //then do what you have to do (can take time)
    doYourStuff();
}

public void doYourStuff() {
    //fake job that takes 10 seconds (100 x 100 millis)
    System.out.println("Job starts...");
    for (int i = 0; i < 100; i++) {
        setProgresso(i);
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
        }
    }
    setProgresso(0);
    System.out.println("Job done.");
}

private long progresso = 0;

public long getProgresso() {
    return progresso;
}

public void setProgresso(long progresso) {
    this.progresso = progresso;
}

public void onComplete() {
    System.out.println("oncomplete !");
}

备注

  • ProgressBar 每 2 或 3 秒更新一次(刷新率不高)
  • onComplete 未被调用(我不明白为什么)

【讨论】:

    猜你喜欢
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多