如何创建"海战#34;带单选按钮的样式表,我发送单选按钮(列)的值和行(行)的值。
例如:
alfa beta omega
o x x A
x o x B
x o x C
成为" o"选择的,我想在支持bean中接收ALFA和A,BETA和B以及BETA和C,是每行中的单一选择,而不是列。 问题是根据从DB检索的行数,列数是动态的。
这是我现在设法做的事情。列是单位,行是行
<h:dataTable value="#{unidadeController.listLines}" var="itemList">
<h:column>
<c:forEach var="i" begin="0"
end="#{bean.listUnits.size()-1}">
<f:facet name="header">
<h:outputText value="#{bean.getUnitName(i)}" />
<p:spacer width="50" height="0" />
</f:facet>
</c:forEach>
<h:selectOneRadio value="#{bean.unit}">
<f:selectItems value="#{bean.listUnits}"
var="c" itemLabel="" itemValue="#{c.id}" />
</h:selectOneRadio>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{labelController.name}" />
<br />
</f:facet>
<h:outputText value="#{itemList.name}" />
<br />
</h:column>
</h:dataTable>
豆:
private Unit unit = new Unit();
private List<Unit> units = new ArrayList<Unit>();
public List<Unit> getListUnits()
{
if (this.units.isEmpty())
{
try
{
this.units= Cache.getInstance().getUnits();
}
catch (final WplexEOException e)
{
e.printStackTrace();
}
}
return this.units;
}
public List<Line> getListLines()
{
try
{
return Cache.getInstance().getLines();
}
catch (final WplexEOException e)
{
e.exibeErroNaPagina();
}
return new ArrayList<Line>();
}
public String getUnitName(final int index)
{
return this.units.get(index).getName();
}
alfa,beta,omega是单位。 a,b,c是这些行。
Nome表示葡萄牙语中的名称,如该行的名称。
它渲染我想要的方式,但是无线电并没有将它的值传递给bean,我也需要发送行索引或值。我该如何解决/改善这个问题?
修改 我更改了表格以使用地图,但是当我访问地图时,它是空的。
<h:dataTable value="#{bean.listLines}" var="itemList">
<h:column>
<c:forEach var="itemForEach" items="#{bean.listUnits}" >
<f:facet name="header">
<h:outputText value="#{itemForEach.getName()}" />
<p:spacer width="50" height="0" />
</f:facet>
</c:forEach>
<h:selectOneRadio value="#{bean.mapLines[itemList]}" converter="javax.faces.Integer">
<f:selectItems value="#{bean.listaUnits}"
var="c" itemLabel="" itemValue="#{c.id}" />
</h:selectOneRadio>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{labelController.name}" />
<br />
</f:facet>
<h:outputText value="#{itemList.name}" />
<br />
</h:column>
</h:dataTable>
豆:
private Map<Line, Integer> mapLines = new HashMap<Line, Integer>();
线路课程:(葡萄牙语,抱歉)
Linha =行
Nome = name
Unidade = unit
/*
* $Id: javadoctemplates.xml,v 1.2 2007/05/29 19:28:02 mauro Exp $
*
* Copyright (c) 2004-2007 Wplex Software Ltda. All rights reserved.
*/
package com.wplexeo.model;
import java.io.Serializable;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import org.hibernate.annotations.GenericGenerator;
import com.wplexeo.exception.WplexEOException;
/**
* Linha da programação
*
* @author
*/
@Entity(name = "linha")
@GenericGenerator(name = "gen", strategy = "native")
public class Linha extends Entidade implements Serializable
{
private static final long serialVersionUID = 1L;
private String nome; //name
@ManyToOne
private Unidade unidade;
/**
* @param idDaBusca
* @return Evento
* @throws WplexEOException
*/
public static Linha buscaPorId(final Long idDaBusca) throws WplexEOException
{
return (Linha) Entidade.buscaPorId(Linha.class, idDaBusca);
}
/**
* @return Evento
* @throws WplexEOException
*/
@SuppressWarnings("unchecked")
public static List<Linha> lista() throws WplexEOException
{
return (List<Linha>) Entidade.lista(Linha.class);
}
/**
* @throws WplexEOException
*/
public static void removeTodos() throws WplexEOException
{
Entidade.removeTodos(Linha.class);
}
/**
* @return the nome
*/
public String getNome()
{
return this.nome;
}
/**
* @param nome the nome to set
*/
public void setNome(final String nome)
{
this.nome = nome;
}
/**
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode()
{
final int prime = 31;
int result = super.hashCode();
result = prime * result + (this.nome == null ? 0 : this.nome.hashCode());
result = prime * result + (this.unidade == null ? 0 : this.unidade.hashCode());
return result;
}
/**
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(final Object obj)
{
if (this == obj)
{
return true;
}
if (!super.equals(obj))
{
return false;
}
if (this.getClass() != obj.getClass())
{
return false;
}
final Linha other = (Linha) obj;
if (this.nome == null)
{
if (other.nome != null)
{
return false;
}
}
else if (!this.nome.equals(other.nome))
{
return false;
}
if (this.unidade == null)
{
if (other.unidade != null)
{
return false;
}
}
else if (!this.unidade.equals(other.unidade))
{
return false;
}
return true;
}
}
答案 0 :(得分:1)
首先,我很确定你可以替换这个
<c:forEach var="i" begin="0" end="#{bean.listUnits.size()-1}">
<f:facet name="header">
<h:outputText value="#{bean.getUnitName(i)}" />
<p:spacer width="50" height="0" />
</f:facet>
</c:forEach>
使用(假设bean具有getName()方法)
<c:forEach var="beanListUnit" items="#{bean.listUnits">
<f:facet name="header">
<h:outputText value="#{beanListUnit.getName()}" />
<p:spacer width="50" height="0" />
</f:facet>
</c:forEach>
其次,我不会使用Cache.getInstance并为不同的行重用私有List单元,但暂时保持不变。
然后关于如何检测行+列,我以前如何做到这一点(这可能已经过时,但是:D这是我想出来的方式)是做类似的事情:
<h:dataTable value="#{unidadeController.listLines}" var="itemList">
<h:column>
<c:forEach var="currentBean" items="#{bean.listUnits}">
<f:facet name="header">
<h:outputText value="#{bean.getUnitName(i)}" />
<p:spacer width="50" height="0" />
</f:facet>
</c:forEach>
<h:selectOneRadio value="#{bean.unit}" valueChangeListener="#{bean.radioButtonChange}">
<f:selectItems value="#{bean.listUnits}" var="c" itemLabel="" itemValue="#{bean.id}:#{c.id}" />
</h:selectOneRadio>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{labelController.name}" /><br />
</f:facet>
<h:outputText value="#{itemList.name}" /><br />
</h:column>
</h:dataTable>
用以下内容展开你的bean :(见mkyong's example)
public void radioButtonChange(ValueChangeEvent valueChangeEvent) {
// value was changed
String newValue = e.getNewValue().toString(); // assert not null etc
String[] rowCol = newValue.split(":"); // assert rowCol.length == 2
String rowId = rowCol[0];
String colId = rowCol[1];
// do what you wanted to do, sink a battleship
}
我已经用
进入了伪代码<f:selectItems value="#{bean.listUnits}" var="c" itemLabel="" itemValue="#{bean.id}:#{c.id}" />
但基本上,在itemValue中我会编码行和列(假设c.id还没有包含两者的信息)和onItemChange我会再次拆分这些信息,以便你可以对它进行操作。
如果id已包含此信息(每行/每列都是唯一的,那么您可以忽略此部分)