Java Progressbar don';我不在工作

Java Progressbar don';我不在工作,java,jsf,primefaces,Java,Jsf,Primefaces,我有一个fileUpload按钮,当用户上传文件时,ManagedBean中的进程将启动。这个过程可能非常慢,我需要向用户显示进度。因此,我有以下代码: <p:fileUpload id="commandButtonIniciarImportacao" disabled="#{importacaoArMB.produtoSelecionado == null}" fileUploadListener="#{importacaoArMB.upl

我有一个fileUpload按钮,当用户上传文件时,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>
我将“progress”属性传递给我的BO(business对象),在FOR的每个迭代器中,该属性的值都会递增


问题是:progressBar不会发生任何事情,请在0中继续。

看看这个由您的代码构建的示例

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

<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 !");
}
public void uploadarquivoimportaco(FileUploadEvent fileUploadedEvent){
System.out.println(“文件上传…”);
//在此处收集有关uloaded文件的信息。。。
//然后做你必须做的事情(可能需要时间)
doYourStuff();
}
公共物品{
//耗时10秒(100 x 100毫秒)的假作业
System.out.println(“作业开始…”);
对于(int i=0;i<100;i++){
setProgresso(i);
试一试{
睡眠(100);
}捕捉(中断异常e){
}
}
setProgresso(0);
System.out.println(“完成任务”);
}
私人长期进展o=0;
公共长期发展计划(){
返回progresso;
}
公共空间设置进度(长进度){
this.progresso=progresso;
}
未完成的公共空间(){
System.out.println(“oncomplete!”);
}
评论

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

在高级模式下,已为每个上载的文件包含一个进度条。我不知道如何上传progresso变量。您是否按照描述设置了过滤器和过滤器映射?我将解释:progressbar来自,我发现BO中的所有进程结束后都调用了“progressbar”,但我不知道我看到了什么,问题是您不能启动第二个进程onfileuploaded,因为太早了(progressbar此时还没有启动…)。还有一句话:Label模板不是EL表达式,所以
labelTemplate=“{value}%”
(此处不需要)。但如何解决此问题?我需要在上传文件后启动另一个进程。
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 !");
}