2017-09-26 11 views
2

私はスピナーのステップ係数を少し変更しようとしています。私の意図は正確な数に足を踏み入れることです。 例えば、私のステップ係数は0.25で、スピナーに書いた数字は0.8です。これは1.05にジャンプし、0.55に戻るでしょう。しかし私の意図は、ステップ要因の正確な要素にステップしています。したがって、この場合には、それは0.75と1Primefaces Spinner Modified Step Factor

にジャンプする必要がありますこれは私が今持っカレンダー用のコードです:

<prime:spinner id="inputHoursMonday" 
value="#{attendance.value}" size="5" 
max="#{bean.hoursMaxValue}" stepFactor="0.25" 
min="0" 
disabled="#{attendance.hoursBookedForAttendance}"/> 

は、事前にありがとうございます。

+1

はステップ係数に適合しない値を保存するために許可されたユーザですe.q. 0.8? – lastresort

+0

いいえ、できません。しかし、このケースでは、スピンナーを調整するだけで、保存の進捗状況を調整する必要はありません。 – xlamn

+0

次に、スピナーを 'readonly =" true "'にして、適切な初期値を指定します。 –

答えて

0

私はいくつかのオプションがあると言いましたが、私の答えでは値が2倍になると思います。複数のスピナーを使用している場合は、コンバーターを使用することをお勧めします。なぜなら、すべてのスピナーにそれを追加できるからです。

メモ:スピナーが変更された直後に正しい値を表示するには、p:ajaxを追加する必要があります。フォームの送信と更新が完了するまで待つのが大丈夫なら、ajaxを追加する必要はありません。

1.オプション:リスナー

HTML:

<prime:spinner value="#{bean.value}" max="#{bean.hoursMaxValue}"><p:ajax Listener="#{bean.valueChangeEvent}" update="@this"/></prime:spinner> 

ビーン:

public void valueChangeListener(AjaxBehaviorEvent event){ 
    value = (double)Math.round(value*4)/4; 
} 

2.オプション:Modifiyセッターと

HTMLをゲッタリング。

<prime:spinner value="#{bean.value}"><p:ajax update="@this"/></prime:spinner> 

豆:

public double getValue(){ 
    return (double)Math.round(value*4)/4; 
} 

public void setValue(double value){ 
    this.value = (double)Math.round(value*4)/4; 
} 

3.オプション:コンバータ

注:あなたがコンバータを使用する場合は、豆には何も変更する必要はありません。

HTML:

<prime:spinner value="#{bean.value}" converter="SpinnerConverter"><p:ajax update="@this"/></prime:spinner> 

コンバータ:

@FacesConverter("SpinnerConverter") 
public class SpinnerConverter implements Converter, Serializable { 

    private static final long serialVersionUID = 1L; 

    public SpinnerConverter() { 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) { 
     try {   
      Double doubleValue = Double.parseDouble(value);  
      return String.valueOf((double)Math.round(doubleValue*4)/4); 
     } catch (Exception ex) { 
      throw new ConverterException(ex); 
     } 
    } 

    @Override 
    public Double getAsObject(FacesContext context, UIComponent component, String value) { 
     try { 
      Double doubleValue = Double.parseDouble(value);   
      return (double)Math.round(doubleValue*4)/4; 
     } 
     catch (Exception ex) { 
      throw new ConverterException(ex); 
     } 
    } 
} 
+1

私は個人的には最初からUIの「丸め」も見たいと思うので、 d getterとgetAsString(...)の間で何かしてください。次に、ajaxを使ってコンポーネントを継続的に更新する必要はありません。 – Kukeltje

+0

私はあなたが推薦するようにgetterとgetAsStringを更新しました。あなたが言ったように、彼はいつでもajax経由で更新したくないと思っていた場合に便利かもしれませんが、フォームの提出と更新の後ではなく、正しい値を直接見たいと思っていました。提案: – lastresort

+0

ありがとう!私はセッターを変更し、今それは動作します! :) – xlamn