0

RichFaces 4.1 では、ManagedBean からの rich:progressBar 'currentValue' が for ループで更新されません。

プログレスバー.xhtml

 <h:form id="formProgress">
        <h:commandLink action="#{progressBarBean.startProcess}" value="click here"/>

        <rich:progressBar mode="ajax" value="#{progressBarBean.currentValue}" interval="1000" id="pb"
            enabled="#{progressBarBean.enabled}" minValue="0" maxValue="100">

            <h:outputText value="Retrieving #{progressBarBean.currentValue} of #{progressBarBean.totalRecords}" />
        </rich:progressBar>

    </h:form>

package ap;
import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class ProgressBarBean implements Serializable {

    private static final long serialVersionUID = 8775622106408411357L;


        private boolean enabled = false;

        private Integer totalRecords;
        private Integer currentValue;;

        public String startProcess() {
            setEnabled(true);
            setTotalRecords(100);
            return null;
        }

        public Integer getCurrentValue() {
            if (isEnabled()) {
                for(currentValue=0;currentValue < totalRecords;) {
                    currentValue++;
                }
            }
            return currentValue;
        }

        public boolean isEnabled() {
            return enabled;
        }

        public void setEnabled(boolean enabled) {
            this.enabled = enabled;
        }

        public Integer getTotalRecords() {
            return totalRecords;
        }

        public void setTotalRecords(Integer totalRecords) {
            this.totalRecords = totalRecords;
        }
}

「ここをクリック」リンクをクリックすると、currentValue が非常に速く更新され、totalRecords が突然 100 に達します。インクリメンタルな方法で更新されていませんでした(forループの現在値)。プログレスバーは、メソッドが返す現在値によって更新されません。

助けてください。

4

1 に答える 1

1

問題が 2 つあります。Java コードが意図したとおりに動作しないことと、ページに更新を指示していないことです (更新は自動的には行われません)。

もう一度見てみましょう: 0 から 100 までgetCurrentValue()インクリメントし、100 の結果を返します。変数で何が起こるかは気にせず (または知りません)、メソッドの結果のみを気にします。currentValue#{progressBarBean.currentValue}getCurrentValue()

したがって、すべてが機能するためには、次のようにする必要があります。

ページ

<a4j:commandLink action="#{progressBarBean.startProcess}" value="click here" render="pb" execute="@this"/>
    <rich:progressBar mode="ajax" value="#{progressBarBean.currentValue}" interval="1000" id="pb"
        enabled="#{progressBarBean.enabled}" minValue="0" maxValue="100">
        <a4j:ajax event="begin" listener="#{progressBarBean.increment}" render="text"/>

        <h:outputText value="Retrieving #{progressBarBean.currentValue} of #{progressBarBean.totalRecords}" id="text" />
    </rich:progressBar>

a4j:ajax毎秒 (つまり、間隔ごとに) 起動currentValueされ、テキストをインクリメントして更新します。

a4j:commandLinkまた、プログレスバーを再レンダリングするために(またはa4j:ajax内部で)必要がありh:commandLinkます。例では、Bean でプログレスバーを有効にしますが、ページの値は変更されません。

public Integer getCurrentValue() {
    return currentValue;
}

public void increment() {
    if (isEnabled() && currentValue < totalRecords) {
        currentValue++;
    }
}

不明な点があれば質問してください。

于 2013-04-23T11:09:08.580 に答える