如何创建一场海战#34;样式表与JSF中的单选按钮

时间:2015-01-30 12:06:31

标签: jsf jsf-2

如何创建"海战#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();
    }

zxcvzxcv

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;
    }
}

1 个答案:

答案 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已包含此信息(每行/每列都是唯一的,那么您可以忽略此部分)