我已经解决了我的问题。也许我面临的问题不经常提出,我发布解决方案并希望它可以帮助其他面临像我这样的问题的人。
首先,我想要的是其中的列是特定的表单字段。但这将是用户
谁决定是否要添加新的表单域。正如你在图中看到的,这就是我想要的:
为了做到这一点,我使用了 primefaces <p:columns> 可能性。但是由于这个标签在特定的支持 bean 的帮助下为 dataTable 的所有行添加了一列,所以我已经用尽了<ui:repeat> 以便剩余的 dataTable 只有一行,正如您在 xhtml 代码中看到的那样:
研究类型列表
<ui:repeat var="thisQuadripole" value="#{saParametrageJbCoordinateurPrincipal.dataTableList.quadripoles}">
<h3>
<h:outputText value="#{thisQuadripole.quadripoleName}"></h:outputText>
</h3>
<ui:repeat var="thisMonoDatatable" value="#{thisQuadripole.monoDataTables}">
<h4>
<h:outputText value="#{thisMonoDatatable.directive}"></h:outputText>
</h4>
<p:dataTable value="" styleClass="normal" style="able-layout: fixed; width: 20px;" id="datatable">
<p:columns var="thisColumn" value="#{thisMonoDatatable.dataTableColumns}">
<f:facet name="header">
<h:outputText value="#{thisColumn.header}"></h:outputText>
</f:facet>
<h:selectOneMenu value="#{recherchesEcranBean.colonneTypeRechercheJb.sousColonne}">
<f:selectItems value="#{saParametrageJbCoordinateurPrincipal.toutTypeColonne}"></f:selectItems>
</h:selectOneMenu>
<p></p>
<p:outputLabel for="largeur2" value="(largeur)% "></p:outputLabel>
<p:inputText id="largeur2" value="#{recherchesEcranBean.colonneTypeRechercheJb.largeurAffichage}"
style="width: 40%;"></p:inputText>
</p:columns>
<p:column>
<f:facet name="header" style="width:10px;">
<h:outputText value=""></h:outputText>
</f:facet>
<h:commandButton id="thisButton"
action="#{saParametrageJbCoordinateurPrincipal.addNewColumnToMonoDataTable(thisMonoDatatable)}"
value=" + " style="background-color: #db70b8; cursor:pointer">
<f:ajax execute="@this" render="datatable"></f:ajax>
</h:commandButton>
</p:column>
</p:dataTable>
</ui:repeat>
</ui:repeat>
</h:form>
为此,我使用了四个支持 bean,其中一个,正如我将解释的那样,是由我正在从事的项目强加给我的,但其他三个是您需要使用的。第一个,我命名为 DataTableList 仅包含另一个名为 Quadripole 的 bean 的列表(命名来自我的物理学背景):
@ManagedBean
@SessionScoped
public class DataTableList
{
@ManagedProperty(value="#{quadripoles}")
private List<Quadripole> quadripoles;
public List<Quadripole> getQuadripoles() {
if (quadripoles == null) {
quadripoles = new ArrayList<Quadripole>();
}
return quadripoles;
}
}
Quardripole 实际上是一个包含四个数据表的 bean,我称之为 MonoDataTable:*
@ManagedBean
@SessionScoped
public class Quadripole
{
@ManagedProperty(value="#{quadripoleName}")
private String quadripoleName;
@ManagedProperty(value="#{monoDataTables}")
private List<MonoDataTable> monoDataTables;
public Quadripole() {
//Emty contructor for managedBean
}
public Quadripole(String quadripoleName) {
this.quadripoleName = quadripoleName;
}
/**
* Accesseur de quadripoleName
*
* @return quadripoleName
*/
public String getQuadripoleName()
{
return quadripoleName;
}
/**
* Mutateur de quadripoleName
*
* @param quadripoleName quadripoleName
*/
public void setQuadripoleName(String quadripoleName)
{
this.quadripoleName = quadripoleName;
}
MonodataTable 包含一个 dataTableColumns 列表:
@ManagedBean
@ViewScoped
公共类 MonoDataTable 实现 Serializable
{
/**
* serialVersionUID - long, DOCUMENTEZ_MOI
*/
private static final long serialVersionUID = 1L;
@ManagedProperty(value="#{directive}")
private String directive;
@ManagedProperty(value="#{}")
private int columnCounter = 1;
@ManagedProperty(value="#{dataTableColumns}")
private List<DataTableColumn> dataTableColumns = new ArrayList<DataTableColumn>();
public MonoDataTable() {
//Empty constructor for managedBean
}
public MonoDataTable(String directive)
{
// DOCUMENTEZ_MOI Raccord de constructeur auto-généré
this.directive = directive;
}
/**
* Accesseur de directive
*
* @return directive
*/
public String getDirective()
{
return directive;
}
/**
* Mutateur de directive
*
* @param directive directive
*/
public void setDirective(String directive)
{
this.directive = directive;
}
/**
* Accesseur de columnCounter
*
* @return columnCounter
*/
public int getColumnCounter()
{
return columnCounter;
}
/**
* Mutateur de columnCounter
*
* @param columnCounter columnCounter
*/
public void setColumnCounter(int columnCounter)
{
this.columnCounter = columnCounter;
}
public List<DataTableColumn> getDataTableColumns() {
return dataTableColumns;
}
}
/**
* Accesseur de monoDataTables
*
* @return monoDataTables
*/
public List<MonoDataTable> getMonoDataTables()
{
if (monoDataTables == null ) {
monoDataTables = new ArrayList<MonoDataTable>();
}
return monoDataTables;
}
}
在特定函数的帮助下以这种方式:
public static void addMonoDataTablesToQuadripole(Quadripole quadripole) {
String directive = null;
directive = "Autre Structure ou National 0";
MonoDataTable newmonoDataTable = new MonoDataTable(directive);
addFixedColumnsToMonoDataTable(newmonoDataTable);
quadripole.getMonoDataTables().add(newmonoDataTable);
directive = "Direction 3";
MonoDataTable newmonoDataTable2 = new MonoDataTable(directive);
addFixedColumnsToMonoDataTable(newmonoDataTable2);
quadripole.getMonoDataTables().add(newmonoDataTable2);
directive = "Direction 7";
MonoDataTable newmonoDataTable3 = new MonoDataTable(directive);
addFixedColumnsToMonoDataTable(newmonoDataTable3);
quadripole.getMonoDataTables().add(newmonoDataTable3);
directive = "Direction 10";
MonoDataTable newmonoDataTable4 = new MonoDataTable(directive);
addFixedColumnsToMonoDataTable(newmonoDataTable4);
quadripole.getMonoDataTables().add(newmonoDataTable4);
}
/**
*
* DOCUMENTEZ_MOI
*
* @param monoDataTable
*/
public static void addFixedColumnsToMonoDataTable(MonoDataTable monoDataTable) {
int columnCounter = monoDataTable.getColumnCounter();
String header = columnHeader + columnCounter;
DataTableColumn newDataTableColumn = new DataTableColumn(header);
monoDataTable.getDataTableColumns().add(newDataTableColumn);
monoDataTable.setColumnCounter(++columnCounter);
columnCounter = monoDataTable.getColumnCounter();
header = columnHeader + columnCounter ;
DataTableColumn newDataTableColumn2 = new DataTableColumn(header);
monoDataTable.getDataTableColumns().add(newDataTableColumn2);
monoDataTable.setColumnCounter(++columnCounter);
}
/**
*
* DOCUMENTEZ_MOI
*
* @param monoDataTable
*/
public static void addNewColumnToMonoDataTable(MonoDataTable monoDataTable) {
int columnCounter = monoDataTable.getColumnCounter();
String header = columnHeader + columnCounter;
DataTableColumn newDataTableColumn = new DataTableColumn(header);
monoDataTable.getDataTableColumns().add(newDataTableColumn);
monoDataTable.setColumnCounter(++columnCounter);
}
每次用户点击“+”时,结果都会在收到点击的那一行添加一列。也许这个解决方案不太优雅,但它对我有用。我希望,至少,它不会太愚蠢。