Teclado Virtual Primefaces capturar foco componente

4 respostas
linuxlive

Pessoal, estou tentando montar um componente para ser um teclado virtual, sendo assim, as minhas telas irão implementar esse componente e conforme clicado nos botões, irá preencher os inputtext. Mas nesta tela, tenho vários inputtext, e eu preciso saber para qual input vou enviar os dados do teclado virtual.

Não estou conseguindo encontrar nada para capturar qual input está com foco. Lembrando que, não sei o nome deste input, pois cada tela tem nomes variados.
Minha dúvida é como capturar o input que está com foco, e enviar para ele os valores do teclado virtual.
O teclado virtual foi feito com commandButton do primefaces 2.2.

Teclado:

<ui:define name="body">
   	
            <p:panel id="display" header="Teclado" style="margin-top:10px;">    
                <br/>    
                &lt;h:inputText id="campo" value="#{teclado.campo}"/&gt;
                &lt;h:inputText id="campo1" value="#{teclado.campo2}"/&gt;
            &lt;/p:panel&gt;    
            &lt;p:panel&gt;    
                &lt;p:commandButton value="7" action="#{teclado.preencher('7')}" update="bodyForm:display"/&gt;    
                &lt;p:commandButton value="8" action="#{teclado.preencher('8')}" update="bodyForm:display"/&gt;    
                &lt;p:commandButton value="9" action="#{teclado.preencher('9')}" update="bodyForm:display"/&gt;

...

Bean:

@ManagedBean(name = "teclado")
@SessionScoped
public class Teclado {

	private String campo;
	private String campo2;

	public String getCampo() {
		return campo;
	}

	public void setCampo(String campo) {
		this.campo = campo;
	}
	
	public String getCampo2() {
		return campo2;
	}

	public void setCampo2(String campo2) {
		this.campo2 = campo2;
	}

	public void preencher(String campo) {  
	       this.campo += campo;  
	}

Neste caso, estou preenchendo apenas o um campo, mas preciso de algo genérico, pois saberei o nome do campo somente quando capturar quem está com o foco.

4 Respostas

AmauriSpPoa
Ve se isso te ajuda.
&lt;h:form id="bodyForm"&gt;    
            &lt;p:panel id="display" header="Teclado" style="margin-top:10px;"&gt;    
                <br/>    
                &lt;h:inputText id="campo" value="#{teclado.campo}"/&gt;    
                &lt;h:inputText id="campo1" value="#{teclado.campo1}"/&gt;    
            &lt;/p:panel&gt;    
            &lt;p:panel&gt;    
                &lt;p:commandButton value="7" action="#{teclado.preencher('7','campo')}" update="bodyForm:display"/&gt;    
                &lt;p:commandButton value="8" action="#{teclado.preencher('8','campo')}" update="bodyForm:display"/&gt;    
                &lt;p:commandButton value="9" action="#{teclado.preencher('9','campo')}" update="bodyForm:display"/&gt;    
                <br/>    
                &lt;p:button value="4"/&gt;    
                &lt;p:button value="5"/&gt;    
                &lt;p:button value="6"/&gt;    
                <br/>    
                &lt;p:button value="1"/&gt;    
                &lt;p:button value="2"/&gt;    
                &lt;p:button value="3"/&gt;    
                <br/>    
                &lt;p:button value="Limpa"/&gt;    
                &lt;p:button value="0"/&gt;    
                &lt;p:button value=","/&gt;    
            &lt;/p:panel&gt;    
            &lt;p:panel&gt;    
                &lt;p:commandButton value="7" action="#{teclado.preencher('7','campo1')}" update="bodyForm:display"/&gt;    
                &lt;p:commandButton value="8" action="#{teclado.preencher('8','campo1')}" update="bodyForm:display"/&gt;    
                &lt;p:commandButton value="9" action="#{teclado.preencher('9','campo1')}" update="bodyForm:display"/&gt;    
                <br/>    
                &lt;p:button value="4"/&gt;    
                &lt;p:button value="5"/&gt;    
                &lt;p:button value="6"/&gt;    
                <br/>    
                &lt;p:button value="1"/&gt;    
                &lt;p:button value="2"/&gt;    
                &lt;p:button value="3"/&gt;    
                <br/>    
                &lt;p:button value="Limpa"/&gt;    
                &lt;p:button value="0"/&gt;    
                &lt;p:button value=","/&gt;    
            &lt;/p:panel&gt;    
        &lt;/h:form&gt;
private String campo;
    private String campo1;

    public String getCampo1() {
        return campo1;
    }

    public void setCampo1(String campo1) {
        this.campo1 = campo1;
    }

    public String getCampo() {
        return campo;
    }

    public void setCampo(String campo) {
        this.campo = campo;
    }

    public void preencher(String valor, String campo) {

        Method metodoSet = null;
        Method metodoGet = null;
        try {
            metodoSet = this.getClass().getMethod("set" + toInitCap(campo), String.class);
            metodoGet = this.getClass().getMethod("get" + toInitCap(campo));
        } catch (NoSuchMethodException | SecurityException ex) {
            Logger.getLogger(Teclado.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            System.out.println(metodoGet.invoke(this, new Object[]{}));
            metodoSet.invoke(this, metodoGet.invoke(this) + valor);
        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException illegalAccessException) {
        }
    }

    public String toInitCap(String valor) {
        return valor.substring(0, 1).toUpperCase() + valor.substring(1);
    }
linuxlive

AmauriSpPoa, O meu problema é que não sei o id do campo, pois estou montando um componente.
Neste caso, eu preciso capturar o id do campo que está com o foco, e a partir dai capturar o id e passar como parâmetro.

Como capturar o componente que está com o foco que está complicado. Mesmo assim, esse código que você postou, já ajudaria na segunda parte.

AmauriSpPoa

Cara o foco você não vai ter nunca pois como está usando botões <p:commandButton> quando clicar vai perder o foco o inputText, e quando mandar fazer o update no painel onde está os inputs, também perderá o foco.

Você pode passar um parâmetro para o controller no momento do focus no campo e depois usar isso para identificar em qual campo deve adicionar o valor.

linuxlive

Você tem razão.
Eu tinha montado um teste aqui como você falou, para jogar em um controller, mas e não consegui fazer funcionar.
O que tentei fazer, foi:

&lt;h:inputText id="campo" value="#{teclado.campo}" onclick="#{teclado.preencherId}"/&gt;

Com o objetivo de ao clicar no inputtext, ele chamasse o preencherId do bean:

public void preencherId(ActionEvent evt) {
		this.idCampo = evt.getComponent().getId();
	}

Mas não da certo, e retorna:

16:35:13,749 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/RestauranteWEB].[Faces Servlet]] Servlet.service() for servlet Faces Servlet threw exception: javax.el.PropertyNotFoundException: /pages/touch/Teclado.xhtml @15,100 onclick="#{teclado.preencherId}": The class ‘br.com.socin.econect.restaurante.web.beans.Teclado’ does not have the property ‘preencherId’.

Criado 11 de janeiro de 2013
Ultima resposta 11 de jan. de 2013
Respostas 4
Participantes 2