adf:在af:table中使用单选按钮进行单行选择

时间:2017-09-28 13:23:55

标签: oracle-adf

这不是一个问题,更好的说 - 这是一个有点问题的答案:有更好的解决方案吗? :)

假设您有一个包含某些行的网格。

在每一行中,您要放置一个单选按钮,并且只能在网格中选择一个单选按钮(每行有一个单选按钮)。 此单选按钮不仅应用于显示所选行,还应用于通过单击单选按钮选择行。 选择基于表的字段,其中包含1个用于选定的字段,0或null用于所有其他行。

以下是实现目标的简短指南:

  1. (显而易见的部分)
  2. 添加一个带有radiobutton的列:

    <af:column headerText="#{bindings.DocsignersliteView2.hints.Isactual.label}"
               id="c14" align="center">
         <af:selectBooleanRadio label="Label 1"
                                id="sbr1"
                                value="#{row.Isactual}"
                                group="Isactual"                                
                                autoSubmit="true">
         </af:selectBooleanRadio>
    </af:column>
    

    其中Isactual - 表中的字段,其中包含所选项目的1和所有其他项目的null

    应该实现onActual方法来更改表中字段Isactual的值。

    1. 似乎不起作用。现在它显示了一个实际的行,但是当我选择另一个单选按钮时它不起作用。 当然,我试图创建ValueChangeListener,但从未成功 - 它无法正常工作。 好的,让我们尝试反转“onClickListener”,因为selectBooleanRadio没有这样的属性:
    2. 让我们添加clientlistener,javascript和服务器监听器:

              <af:resource type="javascript">
                function onClickRadio(actionEvent) {
                    var comp = actionEvent.getSource();
                    AdfCustomEvent.queue(comp, "IsactualClickEvent", 
                                         {},
                                         true);
                    actionEvent.cancel();
                }
              </af:resource>
      
          <af:selectBooleanRadio label="Label 1"
                                 id="sbr1"
                                 value="#{row.Isactual}"
                                 group="Isactual"
                                 autoSubmit="true">
                  <af:clientListener type="click" method="onClickRadio"/>
              <af:serverListener type="IsactualClickEvent"
                                 method="#{viewScope.signerBean.onActual}"/>
          </af:selectBooleanRadio>
      
      1. 它几乎可以工作,但还有一个“微小”细节:一个值为1和0的字段(或1和null) - 与布尔值不完全相同,所以这个selectBooleanRadio需要一个转换器。
      2. 所以我们应该创建一个实现转换器的类:

        public class BooleanDecimalConverter implements Converter {
            public BooleanDecimalConverter() {
                super();
            }
        
            @Override
            public Object getAsObject(FacesContext facesContext, UIComponent uIComponent, String string) {
                if (string == null || string.isEmpty())
                    return null;
                return "true".equals(string) ? BigDecimal.valueOf(1) : BigDecimal.valueOf(0);
            }
        
            @Override
            public String getAsString(FacesContext facesContext, UIComponent uIComponent, Object object) {
                if (object == null)
                    return null;
                String result;
                if (object instanceof Boolean){
                    result = object.toString();
                }
                else if (object instanceof BigDecimal) {
                    BigDecimal num = ((BigDecimal)object);
                    result = num.compareTo(BigDecimal.valueOf(1)) == 0? "true" : "false";
                }
                else {
                    result = "false";
                }
                return result;
            }
        }
        

        然后在应用程序的JSF配置文件(faces-config.xml)中注册自定义转换器:

        <converter>
            <converter-id>custom.BooleanDecimalConverter</converter-id>
            <converter-class>common.utils.converters.BooleanDecimalConverter</converter-class>
        </converter>
        

        最后我们可以为af添加一个转换器属性:selectBooleanRadio:

            <af:selectBooleanRadio label="Label 1"
                                   id="sbr1"
                                   value="#{row.Isactual}"
                                   group="Isactual"
                                   converter="custom.BooleanDecimalConverter"
                                   autoSubmit="true">
                    <af:clientListener type="click" method="onClickRadio"/>
                <af:serverListener type="IsactualClickEvent"
                                   method="#{viewScope.signerBean.onActual}"/>
            </af:selectBooleanRadio>
        

        我们现在拥有的:

        带有行的网格,单选按钮显示“活动”行,并允许用户在单击单选按钮时立即更改“活动”行。

0 个答案:

没有答案