我在JSF中遇到问题。我使用Primefaces DataTable对象创建了一个动态表。动态是指我可以随时添加和删除列。为此,我受到了primefaces网站上给出的示例的启发。 DataTable由第一列组成,该列代表行的ID,然后是一个至其他几列,仅包含selectBooleanCheckbox对象。
当我单击selectBooleanCheckbox时,我想在弹出窗口中显示该行的ID值以及相关列的标题。 但是我做不到,显示的不是好的值。
我在Java 6中使用JSF 2.0和Primefaces 6.2。
//Java object that represents the lines of my table
public class FunctionActionData
{
//The boolean array represents each column of the array
private Boolean[] isActivated;
private String id;
}
我还有一个View(或MBean)对象将管理我的JSF应用:
@ManagedBean(name = "dtColumnsView")
@ApplicationScoped
public class ColumnsView implements Serializable
{
/**
*
*/
private static final long serialVersionUID = -749089990661485115L;
private final static List<String> VALID_COLUMN_KEYS = new ArrayList<String>();
private List<ColumnModel> columns;
private List<FunctionActionData> functionActionDatas;
@ManagedProperty("#{functionActionServices}")
private FunctionActionServices service;
@PostConstruct
public void init()
{
functionActionDatas = service.createFunctionActionDatas();
for(FunctionData data : service.getListData())
{
VALID_COLUMN_KEYS.add(data.getShortLabel());
}
createDynamicColumns();
}
private void createDynamicColumns()
{
String[] columnKeys = VALID_COLUMN_KEYS.toArray(new String[VALID_COLUMN_KEYS.size()]);
columns = new ArrayList<ColumnModel>();
int i = 0;
for (String columnKey : columnKeys)
{
columns.add(new ColumnModel(columnKey.toUpperCase(), i));
i++;
}
}
public void updateColumns()
{
// reset table state
UIComponent table = FacesContext.getCurrentInstance().getViewRoot().findComponent(":form:functionActionDatas");
table.setValueExpression("sortBy", null);
// update columns
createDynamicColumns();
}
static public class ColumnModel implements Serializable
{
/**
*
*/
private static final long serialVersionUID = -3314098148361435201L;
private String header;
private int property;
public ColumnModel(String header, int property)
{
this.header = header;
this.property = property;
}
public String getHeader()
{
return header;
}
public int getProperty()
{
return property;
}
}
}
最后是我页面的xhtml文件:
<f:view>
<h:form id="form">
<h:panelGrid columns="3" style="margin:10px 0">
<p:commandButton value="Add feature"
oncomplete="PF('addClmn').show()">
<p:resetInput target="addColumn" />
</p:commandButton>
</h:panelGrid>
<p:dataTable id="functionActionDatas" var="functionActionData"
value="#{dtColumnsView.functionActionDatas}" scrollable="true"
scrollHeight="500" widgetVar="functionActionDatasTable"
filteredValue="#{dtColumnsView.filteredFunctionActionDatas}"
styleClass="myTable">
<p:column headerText="CODE CR"
filterBy="#{functionActionData.regionalBankId}">
<h:outputText value="#{functionActionData.regionalBankId}" />
</p:column>
<p:columns value="#{dtColumnsView.columns}" var="column"
columnIndexVar="colIndex">
<f:facet name="header">
<h:outputText value="#{column.header}" />
<br />
<p:commandButton value="Delete" />
</f:facet>
<center>
<p:selectBooleanCheckbox
value="#{functionActionData.isActivated[column.property]}"
update=":form:display" onchange="PF('dlg').show()" />
</center>
</p:columns>
</p:dataTable>
<p:dialog id="dialog" header="Values" modal="true" resizable="false"
showEffect="fade" widgetVar="dlg">
<p:ajax event="close" update="dialog" />
<h:panelGrid columns="1" id="display">
<h:outputText value="Value: #{column.property}" />
<h:outputText value="Value: #{functionActionData.regionalBankId}" />
<h:outputText value="Value: #{column.header}" />
</h:panelGrid>
</p:dialog>
<p:dialog id="addColumn" header="Values" modal="true"
resizable="false" showEffect="fade" widgetVar="addClmn">
<h:panelGrid columns="2" id="display2">
<h:outputText value="Short label: " />
<h:inputText id="msgShortLabel"
value="#{dtColumnsView.msgShortLabel}" />
<h:outputText value="Feature label: " />
<h:inputText id="msgLongLabel"
value="#{dtColumnsView.msgLongLabel}" />
<p:commandButton update="functionActionDatas"
action="#{dtColumnsView.updateColumns}" value="Add"
process="@parent"
oncomplete="PF('functionActionDatasTable').clearFilters()">
</p:commandButton>
</h:panelGrid>
</p:dialog>
</h:form>
</f:view>
您将看到有一个打开对话窗口的按钮,该对话框允许后验者添加或删除列,但这不是我们感兴趣的。
当我们单击selectBooleanCheckBox时,我们感兴趣的是打开的窗口。
无论您单击哪种selectBooleanCheckBox,我总是得到相同的结果。正如您在弹出窗口的图像上看到的那样,我没有获得该行的ID,也无法获得单击的selectBooleanCheckBox的优良牧民和正确的冒号。