Geração de componentes através do código

8 respostas
The_Toad

Salve galera,

Tô com uma dúvida que não sei nem como procurar no google ou aqui… bom, é mais ou menos o seguinte:

Eu quero montar uma tabela com uma única coluna, que vai ter como linhas commandLinks ou outputTexts, mas não consigo achar um componente que possa renderizar os dois, de forma que eu possa escolher qual vai ser utilizado pelo backing bean…

Agradeço qualquer sugestão, tô sem idéia de como fazer isso…

Obrigado a todos!

8 Respostas

Lucas_Lacerda_Gertel

Utilize um dataTable mesmo com dois h:column.
No h:column rendered vocÊ coloca o método que é responsavel pela renderização do componente.

Ex:

<h:dataTable>
		<h:column rendered="#{bean.isTimeToRenderOne}" binding="#{bean.columnUm}">
			<h:commandLink></h:commandLink>
		</h:column>
		<h:column rendered="#{bean.isTimeToRenderTwo}" binding="#{bean.columnDois}">
			<h:commandButton />
		</h:column>
	</h:dataTable>

Opa, foi mal… isso é pra colunas.
Pra linhas você deve criar um componente customizado.

Abrax

bueno

a propriedade rendered resolve o que vc precisa, seguindo a linha de raciocinio do Lucas:

<h:dataTable> <h:column <h:commandLink rendered="#{bean.isTimeToRenderOne}" action="somewhere">Texto Link</h:commandLink> <h:outputText rendered="#{bean.isTimeToRenderTwo}" value="etc"/> </h:column> </h:dataTable>

Lucas_Lacerda_Gertel

=o)
Boa!

[]'s

bueno

ou melhor :

<h:dataTable> <h:column <h:commandLink rendered="#{!bean.renderText}" action="somewhere">Texto Link</h:commandLink> <h:outputText rendered="#{bean.renderText}" value="etc"/> </h:column> </h:dataTable>

The_Toad

Pouts… ótima idéia, eu quase resolvi o problema, agora tô penando no código :lol:

O problema agora é o seguinte:
Eu criei a classe

public class LinkText {
	private UIComponent component;

	public boolean isCommand() {
		return (component instanceof UICommand);
	}

	public boolean isText() {
		return component instanceof UIOutput;
	}
	
	public UIComponent getComponent() {
		return component;
	}

	public void setComponent(UIComponent component) {
		this.component = component;
	}
}

e no backing bean usei esse código:

public PlanejamentoAA() {
    componentes = new ArrayList<LinkText>();
    LinkText componente1 = new LinkText();
    LinkText componente2 = new LinkText();
    UICommand command = new UICommand();
    UIOutput output = new UIOutput();

    command.setValue(new String("Modulo 1"));
    output.setValue(new String("Modulo 2"));

    componente1.setComponent(command);
    componentes.add(componente1);
    componente2.setComponent(output);
    componentes.add(componente2);
}

...

public List<LinkText> getComponentes() {
	return componentes ;
}

O code snippet da página:

<h:dataTable value="#{PlanejamentoAA.componentes}" var="componente">
        <h:column>
            <h:commandLink rendered="#{componente.command}" value="#{componente.component.value}"/>
            <h:outputText rendered="#{componente.text}" value="#{componente.component.value}"/>
        </h:column>
    </h:dataTable>

Mas tive uns problemas, utilizando uma pequena variação disso que descrevi acima:
Quando uso o binding ao invés do value (o que realmente quero), recebo o erro

javax.servlet.ServletException: javax.servlet.jsp.JspException: org.apache.jasper.el.JspPropertyNotFoundException: /teste.jsp(17,3) '#{componente.component}' Target Unreachable, identifier 'componente' resolved to null

Como pode ser visto, ao usar o value não há problemas… logo, componente não é null.

Vcs tem idéia do que pode estar acontecendo?

Obrigado!

The_Toad

Ah sim, ao invés de usar um UIComponent tentei com um UICommand e usando só commandLins, mas também não funfou…

Obrigado!

bueno

um problema de cada vez: :slight_smile:

o primeiro é para mostrar ou outputText ou commandLink, a propriedade rendered resolve.

o segundo, pelo o que me parece, é a criação/referencia via binding pelo bean, é isso ? se for não use UICommandButton, por exemplo, use HtmlCommandButton …

The_Toad

realmente, o rendered foi uma mão na roda :lol:

Já o binding continua dando o mesmo problema, substitui o UIComponent por HtmlCommandButton só pra testar e o erro continuou… daí troquei pra value e acresci o .value no dataTable e sem problemas.

Acho que vou resolver o problema sem binding mesmo, menos dor de cabeça.

Obrigado pela ajuda!

Abraços.

Criado 3 de julho de 2008
Ultima resposta 4 de jul. de 2008
Respostas 8
Participantes 3