JSF: Criação de componentes personalizados: como renderizar um commandLink?

1 resposta
kicolobo

Olá,

estou desenvolvendo um componente personalizado no JavaServer Faces que consiste em uma tabela (o dataTable não se enquadra no caso, porque as colunas variam de caso para caso, tornando seu uso inadequado ou exageradamente complexo) na qual, em cada célula, quero imprimir um componente commandLink.

Estou quase lá. Já consigo imprimir o elemento form sem problemas. Consigo também imprimir a minha tabela com seu conteúdo. No entanto, daqui pra baixo seguem algumas dúvidas:

Como imprimir elementos HtmlCommandLink? Dêem uma olhada no código que estou gerando e vocês vão entender o drama:

HtmlForm form = new HtmlForm();
            form.encodeBegin(context);

            writer.startElement("table", this);
            writer.writeAttribute("width", "100%", null);
            writer.writeAttribute("cellpadding", "0px", null);
            writer.writeAttribute("cellspacing", "0px", null);
            writer.writeAttribute("style", "margin-top: 1.0em;", null);
            
            // Imprimindo o nome dos níveis
            writer.startElement("tr", this);
            for (int i = 1; i <= numNiveis; i++)
            {
                writer.startElement("td", this);
                writer.writeAttribute("width", 100 / numNiveis + "%", null);
                writer.writeAttribute("style", "font-size: 1.2em; border-style: solid; border-width: 1px; background-color: #DEDEDE; padding: 0.2em;", null);
                writer.startElement("b", this);
                writer.write(eap.getModelo().getNivel(i).getDescricao());
                writer.endElement("b");
                writer.endElement("td");
            }
            writer.endElement("tr");


            List<NivelEAP> conteudoEAP =  getItensUltimoNivelEAP(eap);
            for (NivelEAP nivel : conteudoEAP)
            {
                writer.startElement("tr", this);
                
                for (int numNivel = 1; numNivel <= numNiveis ; numNivel++)
                {
                    NivelEAP corrente = nivel.getAntecessor(numNivel);
                    writer.startElement("td", this);
                    writer.writeAttribute("style", "border-style: solid; border-width: 1px; padding: 0.4em;", null);
                    if (corrente != null)
                    {
                        HtmlCommandLink link = new HtmlCommandLink();
                        link.setValue(corrente.getDescricao());
                        
                        form.getChildren().add(link);
                        
                        
                        writer.write(corrente.getDescricao() + "<br/>" + corrente.getCodigo());
                        
                    }
                    writer.endElement("td");
                }
                writer.endElement("tr");
            }
            writer.endElement("table");
            
            form.encodeEnd(context);

Se tento simplesmente criar uma nova instância de HtmlCommandLink, setar seus dados e, em seguida, chamar os métodos beginEncode e endEncode, dou de cara com uma excessão do meu container.

Tal como vocês podem ver no código, estou entrando com as tags do elemento TABLE do HTML manualmente devido à limitação do dataTable.
Gostaria de, aonde estou imprimindo a descrição do item, tal como no trecho de código abaixo,

if (corrente != null)
                    {
                        HtmlCommandLink link = new HtmlCommandLink();
                        link.setValue(corrente.getDescricao());
                        
                        form.getChildren().add(link);
                        
                        
                        writer.write(corrente.getDescricao() + "<br/>" + corrente.getCodigo());
                        
                    }

imprimir um elemento commandLink que já apontasse como sua ação uma que encontra-se definida em um dos meus backing beans.
Esta é a segunda pergunta: após ter impresso o commandLink, como setar a ação deste para o backing bean desejado?

Aguardo a ajuda de algum de vocês, mesmo porque, com certeza é alguma bobagem. :smiley:

1 Resposta

cidfillippe

Rpz eu estou com um problema muito parecido com o seu…

Vc conseguiu solucionar?

Abraço

Criado 11 de junho de 2007
Ultima resposta 22 de jan. de 2009
Respostas 1
Participantes 2