JavaJSFDataTable“优雅”地编辑行内容
EDIT1:
正如Valentin Jacquemin所建议的那样,我用一个List<Entry<String,String>>
实现了它
但是,当我现在更改一个值时,tomcat会抛出一个错误:
错误消息:
SEVERE: /bvDesktop_RuleOverviewAddActionNode.xhtml at line 111 and column 115 value="#{paramListKVs.value}": Property 'value' not writable on type java.lang.Object
javax.el.PropertyNotFoundException: /bvDesktop_RuleOverviewAddActionNode.xhtml at line 111 and column 115 value="#{paramListKVs.value}": Property 'value' not writable on type java.lang.Object
以及我的xhtml中的对应行:
<p:dataTable id="paramListKV" var="paramListKVs" value="#{ruleTreeBeanAddActionNode.paramListKV}" editable="true" editMode="cell">
<p:column>
<f:facet name="header">List Key</f:facet>
<h:outputText value="#{paramListKVs.key}"/>
</p:column>
<p:column>
<p:cellEditor id="paramListKVsEditTest">
<f:facet name="header">List Value</f:facet>
<f:facet name="output"><h:outputText value="#{paramListKVs.value}"/></f:facet>
--><f:facet name="input"><p:inputText value="#{paramListKVs.value}" style="width:96%" /></f:facet><--
</p:cellEditor>
</p:column>
</p:dataTable>
以-->;及<;——。
我不知道java试图将代码写入什么。我甚至不确定value="#{paramListKVs.value}"
是否正确。有什么想法吗
我有一个我能够解决的特殊问题,但我觉得我的解决方案更像是一种肮脏的方式。我希望有一个更优雅的方法来做到这一点,但我没有找到一个(搜索如此)。这就是我的问题:
我目前正在创建一个基于规则的框架,用于自动处理一些文件,我想让我们的编辑器能够在一个漂亮、简单的web界面中创建这些规则。
我已经有了所需的网站,数据模型等。然而,一个特殊的问题是,一个操作规则可以具有Set of Properties Key-Value
智能。我选择一个TreeMap
。现在我希望能够add
、delete
和edit
表示数据表中的单元格
爪哇: createActioNode:
@ManagedBean
public class RuleTreeBeanAddActionNode {
...
private TreeMap<String,String> actionParamMap = new TreeMap<String,String>();
private String paramKeyToAdd = "";
private String paramValueToAdd = "";
private int paramKeyIndex;
private String valueToChange;
private String keyForInfo;
private UIComponent datatable;
public void addKeyValueToMap() {
if((paramKeyToAdd != null || !paramKeyToAdd.equals("")) && (paramValueToAdd != null) || !paramValueToAdd.equals("")) {
unusedActionParamKeys.remove(paramKeyToAdd);
usedActionParamKeys.add(paramKeyToAdd);
actionParamsAsListKeys.add(paramKeyToAdd);
actionParamsAsListValues.add(paramValueToAdd);
actionParamMap.put(paramKeyToAdd, paramValueToAdd);
actionParamMapEntries = new ArrayList<Entry<Integer, String>>((Collection<? extends Entry<Integer, String>>) actionParamMap.entrySet());
userSession.setAttribute("actionParamMap", actionParamMap);
userSession.setAttribute("unusedActionParamKeys", unusedActionParamKeys);
userSession.setAttribute("usedActionParamKeys", usedActionParamKeys);
userSession.setAttribute("tempSelectorWorkOn", "");
userSession.setAttribute("tempRuleId", "");
userSession.setAttribute("actionParamsAsListKeys", actionParamsAsListKeys);
userSession.setAttribute("actionParamsAsListValues", actionParamsAsListValues);
paramKeyToAdd = "";
paramValueToAdd = "";
}
}
public void setValueToChange(String valueToChange) {
DataTable dt = (DataTable)datatable;
String id = String.valueOf(paramKeyIndex);
Entry<String, String> temp = (Entry<String, String>)dt.getRowData();
actionParamMap.put((String) temp.getKey(), valueToChange);
}
//getter and setter
createActionNode。xhtml
<tr>
<td>Action Parameter </td>
<td>
<p:dataTable binding="#{ruleTreeBeanAddActionNode.datatable}"
rowKey="test"
rowIndexVar="paramKeyIndex"
id="paramKeysValues"
var="params"
value="#{ruleTreeBeanAddActionNode.actionParamMapEntries}"
editable="true"
editMode="cell">
<p:column id="keys">
<f:facet name="header">Param Key</f:facet>
<h:outputText value="#{params.key}"/>
</p:column>
<p:column id="values">
<f:facet name="header">Param Value</f:facet>
<p:cellEditor id="paramValueEdit">
<f:facet name="output"><h:outputText value="#{params.value}"/></f:facet>
<f:facet name="input"><p:inputText id="evinput" value="#{ruleTreeBeanAddActionNode.valueToChange}" style="width:96%"/></f:facet>
</p:cellEditor>
</p:column>
</p:dataTable>
</td>
</tr>
<tr><td><br/></td></tr>
<tr>
<td>Param To Value</td>
<td>
<table>
<tr>
<td>
<p:selectOneMenu id="paramKeys" value="#{ruleTreeBeanAddActionNode.paramKeyToAdd}">
<f:selectItems value="#{ruleTreeBeanAddActionNode.unusedActionParamKeys}"/>
</p:selectOneMenu>
</td>
<td>
<p:inputText id="paramValue" value="#{ruleTreeBeanAddActionNode.paramValueToAdd}"/>
</td>
</tr>
<tr>
<td></td>
<td>
<p:commandButton id="addParam" value="+" action="#{ruleTreeBeanAddActionNode.addKeyValueToMap}" update="paramKeysValues,paramKeys,paramValue"/>
</td>
</tr>
</table>
</td>
</tr>
我知道我需要返回的不是映射,而是条目集,这样datatable就可以通过它进行数据挖掘。因此,当我编辑单元格中的记录时,函数
^对更改调用{UIComponent
的Datatable
,检索编辑的记录,保存映射并重建条目集
所以我的实际问题是,这是推荐的方式吗?我是否监督过能让我的世界变得更容易的事情?是否有其他人实现了类似的功能
# 1 楼答案
以下是UIData的文档,任何数据表都是它的子项:
因此,正如您所说,您需要一个iterable对象,以便datatable可以在其中循环,并在构建表时公开每个元素
另一方面,这里没有完全利用绑定特性。只需让组件执行其工作,并将
value=#{ruleTreeBeanAddActionNode.actionParams}
、actionParams
设置为List
或任何其他supported type。完成后,datatable的模型将引用ruleTreeBeanAddActionNode.actionParams
元素。你不需要任何进一步的机制来进行同步另见:
更新
我猜你想用AbstractMap.SimpleEntry作为列表的条目。这个类与JavaBean不兼容,尽管
setValue
不是void
类型。创建自己的对象来保存行的状态,这样就有了一个与JavaBean兼容的对象,EL就能正确解析读/写方法:然后在你的后盾中: