这不是一个问题,更好的说 - 这是一个有点问题的答案:有更好的解决方案吗? :)
假设您有一个包含某些行的网格。
在每一行中,您要放置一个单选按钮,并且只能在网格中选择一个单选按钮(每行有一个单选按钮)。 此单选按钮不仅应用于显示所选行,还应用于通过单击单选按钮选择行。 选择基于表的字段,其中包含1个用于选定的字段,0或null用于所有其他行。
以下是实现目标的简短指南:
添加一个带有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的值。
让我们添加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>
所以我们应该创建一个实现转换器的类:
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>
我们现在拥有的:
带有行的网格,单选按钮显示“活动”行,并允许用户在单击单选按钮时立即更改“活动”行。