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/>
<h:inputText id="campo" value="#{teclado.campo}"/>
<h:inputText id="campo1" value="#{teclado.campo2}"/>
</p:panel>
<p:panel>
<p:commandButton value="7" action="#{teclado.preencher('7')}" update="bodyForm:display"/>
<p:commandButton value="8" action="#{teclado.preencher('8')}" update="bodyForm:display"/>
<p:commandButton value="9" action="#{teclado.preencher('9')}" update="bodyForm:display"/>
...
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.
Ve se isso te ajuda.
<h:form id="bodyForm">
<p:panel id="display" header="Teclado" style="margin-top:10px;">
<br/>
<h:inputText id="campo" value="#{teclado.campo}"/>
<h:inputText id="campo1" value="#{teclado.campo1}"/>
</p:panel>
<p:panel>
<p:commandButton value="7" action="#{teclado.preencher('7','campo')}" update="bodyForm:display"/>
<p:commandButton value="8" action="#{teclado.preencher('8','campo')}" update="bodyForm:display"/>
<p:commandButton value="9" action="#{teclado.preencher('9','campo')}" update="bodyForm:display"/>
<br/>
<p:button value="4"/>
<p:button value="5"/>
<p:button value="6"/>
<br/>
<p:button value="1"/>
<p:button value="2"/>
<p:button value="3"/>
<br/>
<p:button value="Limpa"/>
<p:button value="0"/>
<p:button value=","/>
</p:panel>
<p:panel>
<p:commandButton value="7" action="#{teclado.preencher('7','campo1')}" update="bodyForm:display"/>
<p:commandButton value="8" action="#{teclado.preencher('8','campo1')}" update="bodyForm:display"/>
<p:commandButton value="9" action="#{teclado.preencher('9','campo1')}" update="bodyForm:display"/>
<br/>
<p:button value="4"/>
<p:button value="5"/>
<p:button value="6"/>
<br/>
<p:button value="1"/>
<p:button value="2"/>
<p:button value="3"/>
<br/>
<p:button value="Limpa"/>
<p:button value="0"/>
<p:button value=","/>
</p:panel>
</h:form>[code] 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);
}[/code]
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.
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.
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:
<h:inputText id="campo" value="#{teclado.campo}" onclick="#{teclado.preencherId}"/>
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’.