【问题标题】:Primefaces Spinner Modified Step FactorPrimefaces Spinner 修改步长因子
【发布时间】:2017-09-26 08:16:07
【问题描述】:

我正在尝试稍微修改微调器的步进因子。我的意图是准确的数字。 例如,我的步长因子是 0.25,我写入微调器的数字是 0.8,它将向前跳到 1.05 并向后跳到 0.55。但我的意图是步进因子的确切因子。所以在这种情况下,它应该跳到 0.75 和 1。

这是我现在得到的日历的代码:

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

提前谢谢你。

【问题讨论】:

  • 是否允许用户保存不符合步长因子的值 e.q. 0.8?
  • 不,不允许。但在这种情况下,我只想调整微调器而不是保存进度。
  • 然后制作微调器readonly="true"并提供适当的初始值。
  • 然后下载 spinner 的 javascript 源代码并在那里进行适配...应该不会太难
  • 我不明白你的计划。如果不允许用户保存像 0.8 这样的值,为什么只调整微调器?然后,如果他使用正常输入,用户仍然可以保存这些值。那么为什么不实现一个 valueChangeListener 或 Converter 来将输入的每个值四舍五入到下一步因子?

标签: jsf primefaces spinner


【解决方案1】:

正如我所说,有几个选项,我希望我的答案是双倍的。如果您有多个微调器,我建议您使用转换器,因为您可以将其添加到每个微调器中。

注意:如果您想在微调器更改后立即看到正确的值,您只需要添加 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。选项:修改setter和getter

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.选项:转换器

注意:如果使用转换器,则无需修改 bean 中的任何内容。

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);
        }
    }
}

【讨论】:

  • 我个人也希望从一开始就看到 UI 中的“四舍五入”,所以我会在 getter 或转换器的 getAsString(...) 中做一些事情。那么就不需要通过ajax不断更新组件了。
  • 我已按照您的建议更新了 getter 和 getAsString。如果您说他不想一直通过 ajax 更新,这可能会很有用。但我想他可能想直接看到正确的值,而不是在表单提交和更新之后。添加了一个注释来解释它。感谢您的建议:)
  • 谢谢!我修改了设置器,现在它可以工作了! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 2012-05-11
  • 2011-12-01
相关资源
最近更新 更多