从ADF中的selectOneChoice中获取所选值,而不是索引

时间:2012-03-29 06:24:24

标签: java jsf jdeveloper oracle-adf

我是JDeveloper和ADF的新手,我在从selectOneChoice组件中获取所选值时遇到了一些问题。这是valuChangeListener:

public void versionValueChangeListener(ValueChangeEvent valueChangeEvent) {
    System.out.println(valueChangeEvent.getOldValue().toString());
    System.out.println(valueChangeEvent.getNewValue().toString());

}

这是给出所选选项的索引而不是文本本身。我怎样才能获得文本而不是索引? 这是selectOneChoice的代码:

<af:selectOneChoice value="#{bindings.Version.inputValue}"
                                      label="#{bindings.Version.label}"
                                      required="#{bindings.Version.hints.mandatory}"
                                      shortDesc="#{bindings.Version.hints.tooltip}"
                                      id="soc3" autoSubmit="true"
                                      valueChangeListener="#{savesBean.versionValueChangeListener}">
                    <f:selectItems value="#{bindings.Version.items}" id="si3"/>
                  </af:selectOneChoice>

Thanx:)

5 个答案:

答案 0 :(得分:1)

Orcle的这个人就是这样做的

How-to get the selected af:selectOneChoice Label 虽然在我看来可以通过其他方式完成......

我认为你最好建立一个map,其中索引是关键,值是标签

比在versionValueChangeListener中你可以访问这样的地图:

myMap.get(valueChangeEvent.getNewValue().toString());

答案 1 :(得分:0)

这不是针对ADF的。这是HTML特定的。仅发送了HTML <input type="radio">元素的值,而不是引用它的HTML <label>元素的值。对于每个其他HTML <input><select><textarea>元素都是如此。

解决你的问题&#34;很简单:您已经在#{bindings.Version.items}后面的集合中的后备bean中拥有所有标签。只需根据所选值获取标签。

或者,设置整个复杂对象(包含值和标签),而不是仅将其值作为项值。您只需要Converter即可在复杂对象和字符串之间进行转换。

答案 2 :(得分:0)

jsp / jsf页面上的select one choice项有一个属性,允许您传递实际的对象值或从列表中传递索引值。单击jsp / jsf页面中的选择一个选项,然后点击底部的绑定选项卡,转到页面定义(您将在绑定页面的顶部看到它),并且将突出显示选择的一个选项在现在打开的页面定义文件中。如果从这里查看属性检查器 - 有一个名为“SelectItemValueMode”的属性,默认情况下它设置为ListIndex值,您可以从此处将其更改为ListObject。它是从页面定义文件的属性窗口中为选择的一个选项列表对象列出的最后一个属性。

答案 3 :(得分:0)

这对我有用

BindingContainer binding = BindingContext.getCurrent().getCurrentBindingsEntry();
JUCtrlListBinding fc =(JUCtrlListBinding) binding.get(nameOfTheDataControl);
String selectedValue = (fc.getListIterBinding().getRowAtRangeIndex(newIndexSelected).getAttribute(nameOftheColu 
mnInTheDataControl)).toString();

答案 4 :(得分:-1)

您可以在以下网址找到解决方案:https://blogs.oracle.com/adf/entry/getting_selected_value_from_selectonechoice

  

假设我们有一个Deptno属性的模型驱动列表   显示Dname和selectOneChoice的值绑定到Deptno属性   在jspx页面

<af:selectOneChoice value="#{bindings.Deptno.inputValue}" label="Select Department"
                            required="true" shortDesc="#{bindings.Deptno.hints.tooltip}"
                            id="soc1" autoSubmit="true">
          <f:selectItems value="#{bindings.Deptno.items}" id="si1"/>
</af:selectOneChoice>
     

当我们想要选择的值时,我们常犯的错误就是使用   同一个EL绑定到SelectOneChoice组件的value属性,   但是使用这个,我们得到所选项目的索引   比价值。这是因为我们将属性拖放为   SelectOneChoice到页面,SelectItems生成   索引作为值。

     

在jspx页面上显示所选值

     

在本节中,我们将了解如何在不编写的情况下获取所选值   单行java代码。用它创建一个outputText组件   value属性绑定到#{bindings.Deptno.attributeValue}而不是    #{bindings.Deptno.inputValue}并通过添加partialTriggers属性使其可根据列表选择进行刷新。

<af:outputText value = "Selected Value: #{bindings.Deptno.attributeValue}" id="ot1" partialTriggers="soc1"/>
     

上面的代码给出了所选项目的Deptno值。如果   'SALES'的Deptno是30,30将在outputText上显示   从列表中选择“SALES”。

     

如果我们想要显示'SALES'本身,则应该使用以下EL   假设Dname是第二个属性DeptView

<af:outputText value = "Display Value: #{bindings.Deptno.selectedValue ne ' ' ? bindings.Deptno.selectedValue.attributeValues[1] : ''}" id="ot2" partialTriggers="soc1"/>
     

内部价值变动听众

     

在ValueChangeListener中评估上面的EL表达式不会   给出当前选择的值而不是先前选择的值   所选值的值不会被更新到模型   时间ValueChangeListener被调用。

     

在这种情况下,在访问所选值之前,我们需要更新   该模型首先。

     

以下是示例代码:

public void valueChanged(ValueChangeEvent valueChangeEvent) {
    this.setValueToEL("#{bindings.Deptno.inputValue}", valueChangeEvent.getNewValue()); //Updates the model
    System.out.println("\n******** Selected Value: "+resolveExpression("#{bindings.Deptno.attributeValue}"));
    System.out.println("\n******** Display Value: "+resolveExpression("#{bindings.Deptno.selectedValue ne ' ' ? bindings.Deptno.selectedValue.attributeValues[1] : ''}"));
}

public Object resolveExpression(String el) {      
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ELContext elContext = facesContext.getELContext();
    ExpressionFactory expressionFactory =  facesContext.getApplication().getExpressionFactory();        
    ValueExpression valueExp = expressionFactory.createValueExpression(elContext,el,Object.class);
    return valueExp.getValue(elContext);
}

public void setValueToEL(String el, Object val) {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ELContext elContext = facesContext.getELContext();
    ExpressionFactory expressionFactory =   facesContext.getApplication().getExpressionFactory();
    ValueExpression exp = expressionFactory.createValueExpression(elContext, el, Object.class);
    exp.setValue(elContext, val);
}