Primefaces DataTable CellEdit 不更新 outputLabel
Primefaces DataTable CellEdit not updating outputLabel
实际上我在各种不同的论坛上找到了很多关于此的内容,但其中 none 似乎对我有用。我的问题甚至没有那么复杂,但我不明白为什么它不起作用。我已经设置了我的数据table,使其成为 editable 并设置了 editMode="cell"。我设置了 ajax 事件并触发,但新旧值始终为空。
当我完成一个单元格的编辑并转到下一个单元格时,该单元格会恢复为旧值。当我再次单击它时,它会显示新值。 outputLabel 和 inputText 标签都使用完全相同的变量,但它们显示的值不同。我也尝试通过方法调用手动更新 table,但没有任何效果。还尝试在 inputText 标签内放置一个 p:ajax 标签来更新 table,但这也没有用。
这是我的 JSF 代码:
<p:dataTable id="dynamicTable" value="#{column.values}" var="value" editable="true" editMode="cell">
<p:ajax event="cellEdit" listener="bean.updateCell" immediate="true" update=":dynamicTable"/>
<p:columns value="#{bean.columns}" var="column">
<f:facet name="header">
<p:outputLabel value="#{column.name}"/>
</f:facet>
<p:cellEditor>
<f:facet name="output"><p:outputLabel value="#{value}"/></f:facet>
<f:facet name="input"><p:inputText value="#{value}"/></f:facet>
</p:cellEditor>
</p:columns>
</p:dataTable>
这是我的豆子:
@ManagedBean(name = "bean")
@ViewScoped
public class Bean implements Serializable {
private ArrayList<Column> columns;
public ArrayList<Column> getColumns(){
return columns;
}
public void setColumns(ArrayList<Column> columns){
this.columns = columns;
}
@PostConstruct
void init(){
columns = new ArrayList<>();
Column column = new Column();
column.setName("Acronym");
ArrayList<String> values = new ArrayList<>();
values.add("KFC");
values.add("TTYL");
values.add("BRB");
column.setValues(values);
columns.add(column);
column = new Column();
column.setName("Meaning");
values = new ArrayList<>();
values.add("Kentuky Fried Chicken");
values.add("Talk to you later");
values.add("Be right back");
column.setValues(values);
columns.add(column);
}
public void updateCell(CellEditEvent event){
System.out.println((String) event.getNewValue();
}
}
还有我的专栏class:
public class Column{
private ArrayList<String> values;
private String name;
public ArrayList<String> getValues(){
return values;
}
public void setValues(ArrayList<String> values){
this.values = values;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
我重写了代码以不包含敏感信息和重命名的变量,所以如果我遗漏了某些东西,可能是我的代码中已有它,但不小心删除了它。
原来我做p:columns标签的方式不对。在我做了以下更改后,我的问题就解决了。
我创建了一个额外的 class 名为 TableRow 的表格行,其中包含各种字符串 objects 以表示要使用的列。这是新代码:
JSF:
<p:dataTable id="dynamicTable" value="#{bean.tblRows}" var="row" editable="true" editMode="cell">
<p:columns value="#{bean.columns}" var="column">
<f:facet name="header">
<p:outputLabel value="#{column.name}"/>
</f:facet>
<p:cellEditor>
<f:facet name="output"><p:outputLabel value="#{row[column.variable]}"/></f:facet>
<f:facet name="output"><p:inputText value="#{row[column.variable]}"/></f:facet>
</p:cellEditor>
</p:columns>
</p:dataTable>
豆子:
@ManagedBean (name = "bean")
@ViewScoped
public class Bean implements Serializable {
private ArrayList<TableRow> tblRows;
private ArrayList<Column> columns;
public ArrayList<TableRow> getTblRows(){
return tblRows;
}
public void setTblRows(ArrayList<TableRow> tblRows){
this.tblRows = tblRows;
}
public ArrayList<Column> getColumns(){
return columns;
}
public void setColumns(ArrayList<Column> columns){
this.columns = columns;
}
@PostConstruct
void init(){
columns = new ArrayList<>();
columns.add(new Column("Acronym", "col1");
columns.add(new Column("Meaning", "col2");
tblRows = new ArrayList<>();
tblRows.add(new TableRow("KFC", "Kentuky Fried Chicken"));
tblRows.add(new TableRow("TTYL", "Talk to you later"));
tblRows.add(new TableRow("BRB", "Be right back"));
}
}
表格行Class:
public class TableRow {
private String col1;
private String col2;
public TableRow(String col1, String col2){
this.col1 = col1;
this.col2 = col2;
}
public String getCol1(){
return col1;
}
public void setCol1(String col1){
this.col1 = col1;
}
public String getCol2(){
return col2;
}
public void setCol2(String col2){
this.col2 = col2;
}
}
第 Class 列:
public class Column {
private String name;
private String variable;
public Column(String name, String variable){
this.name = name;
this.variable = variable;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public String getVariable(){
return variable;
}
public void setVariable(String variable){
this.variable = variable;
}
}
我之所以使用 "col1" 和 "col2" 而不是给出不同的变量名称是因为用户可以选择列 header 名称所以我不知道该命名什么提前的变量。我想知道是否有人愿意启发我如何更好地动态处理这个问题。当 bean 初始化时,我不知道会有多少列或列名是什么。
实际上我在各种不同的论坛上找到了很多关于此的内容,但其中 none 似乎对我有用。我的问题甚至没有那么复杂,但我不明白为什么它不起作用。我已经设置了我的数据table,使其成为 editable 并设置了 editMode="cell"。我设置了 ajax 事件并触发,但新旧值始终为空。
当我完成一个单元格的编辑并转到下一个单元格时,该单元格会恢复为旧值。当我再次单击它时,它会显示新值。 outputLabel 和 inputText 标签都使用完全相同的变量,但它们显示的值不同。我也尝试通过方法调用手动更新 table,但没有任何效果。还尝试在 inputText 标签内放置一个 p:ajax 标签来更新 table,但这也没有用。
这是我的 JSF 代码:
<p:dataTable id="dynamicTable" value="#{column.values}" var="value" editable="true" editMode="cell">
<p:ajax event="cellEdit" listener="bean.updateCell" immediate="true" update=":dynamicTable"/>
<p:columns value="#{bean.columns}" var="column">
<f:facet name="header">
<p:outputLabel value="#{column.name}"/>
</f:facet>
<p:cellEditor>
<f:facet name="output"><p:outputLabel value="#{value}"/></f:facet>
<f:facet name="input"><p:inputText value="#{value}"/></f:facet>
</p:cellEditor>
</p:columns>
</p:dataTable>
这是我的豆子:
@ManagedBean(name = "bean")
@ViewScoped
public class Bean implements Serializable {
private ArrayList<Column> columns;
public ArrayList<Column> getColumns(){
return columns;
}
public void setColumns(ArrayList<Column> columns){
this.columns = columns;
}
@PostConstruct
void init(){
columns = new ArrayList<>();
Column column = new Column();
column.setName("Acronym");
ArrayList<String> values = new ArrayList<>();
values.add("KFC");
values.add("TTYL");
values.add("BRB");
column.setValues(values);
columns.add(column);
column = new Column();
column.setName("Meaning");
values = new ArrayList<>();
values.add("Kentuky Fried Chicken");
values.add("Talk to you later");
values.add("Be right back");
column.setValues(values);
columns.add(column);
}
public void updateCell(CellEditEvent event){
System.out.println((String) event.getNewValue();
}
}
还有我的专栏class:
public class Column{
private ArrayList<String> values;
private String name;
public ArrayList<String> getValues(){
return values;
}
public void setValues(ArrayList<String> values){
this.values = values;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
我重写了代码以不包含敏感信息和重命名的变量,所以如果我遗漏了某些东西,可能是我的代码中已有它,但不小心删除了它。
原来我做p:columns标签的方式不对。在我做了以下更改后,我的问题就解决了。
我创建了一个额外的 class 名为 TableRow 的表格行,其中包含各种字符串 objects 以表示要使用的列。这是新代码:
JSF:
<p:dataTable id="dynamicTable" value="#{bean.tblRows}" var="row" editable="true" editMode="cell">
<p:columns value="#{bean.columns}" var="column">
<f:facet name="header">
<p:outputLabel value="#{column.name}"/>
</f:facet>
<p:cellEditor>
<f:facet name="output"><p:outputLabel value="#{row[column.variable]}"/></f:facet>
<f:facet name="output"><p:inputText value="#{row[column.variable]}"/></f:facet>
</p:cellEditor>
</p:columns>
</p:dataTable>
豆子:
@ManagedBean (name = "bean")
@ViewScoped
public class Bean implements Serializable {
private ArrayList<TableRow> tblRows;
private ArrayList<Column> columns;
public ArrayList<TableRow> getTblRows(){
return tblRows;
}
public void setTblRows(ArrayList<TableRow> tblRows){
this.tblRows = tblRows;
}
public ArrayList<Column> getColumns(){
return columns;
}
public void setColumns(ArrayList<Column> columns){
this.columns = columns;
}
@PostConstruct
void init(){
columns = new ArrayList<>();
columns.add(new Column("Acronym", "col1");
columns.add(new Column("Meaning", "col2");
tblRows = new ArrayList<>();
tblRows.add(new TableRow("KFC", "Kentuky Fried Chicken"));
tblRows.add(new TableRow("TTYL", "Talk to you later"));
tblRows.add(new TableRow("BRB", "Be right back"));
}
}
表格行Class:
public class TableRow {
private String col1;
private String col2;
public TableRow(String col1, String col2){
this.col1 = col1;
this.col2 = col2;
}
public String getCol1(){
return col1;
}
public void setCol1(String col1){
this.col1 = col1;
}
public String getCol2(){
return col2;
}
public void setCol2(String col2){
this.col2 = col2;
}
}
第 Class 列:
public class Column {
private String name;
private String variable;
public Column(String name, String variable){
this.name = name;
this.variable = variable;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public String getVariable(){
return variable;
}
public void setVariable(String variable){
this.variable = variable;
}
}
我之所以使用 "col1" 和 "col2" 而不是给出不同的变量名称是因为用户可以选择列 header 名称所以我不知道该命名什么提前的变量。我想知道是否有人愿意启发我如何更好地动态处理这个问题。当 bean 初始化时,我不知道会有多少列或列名是什么。