já pesquisei e testei diversos métodos mais ambos não funcionaram, não sei ao certo o porque. Sou novato em jsf segue abaixo meu código em .xhtml e o meu managedBean. Desde já agradeço a todos pela atenção.
.xhtml:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<link rel="apple-touch-icon" class="iconeAppleMenor" href="/icone/apple-icon-57x57.png"/>
<link rel="apple-touch-icon" class="iconeAppleMenorMedio" href="/icone/apple-icon-60x60.png"/>
<link rel="apple-touch-icon" class="iconeAppleMenorGrande" href="/icone/apple-icon-72x72.png"/>
<link rel="apple-touch-icon" class="iconeAppleMenorExtraGrande" href="/icone/apple-icon-76x76.png"/>
<link rel="apple-touch-icon" class="iconeAppleTabletMenor" href="/icone/apple-icon-114x114.png"/>
<link rel="apple-touch-icon" class="iconeAppleTabletMedio" href="/icone/apple-icon-120x120.png"/>
<link rel="apple-touch-icon" class="iconeAppleTabletGrande" href="/icone/apple-icon-144x144.png"/>
<link rel="apple-touch-icon" class="iconeAppleTabletExtraGrande" href="/icone/apple-icon-152x152.png"/>
<link rel="apple-touch-icon" class="iconeAppleTablet" href="/icone/apple-icon-180x180.png"/>
<link rel="icon" type="image/png" class="iconeAndroid" href="/icone/android-icon-192x192.png"/>
<link rel="icon" type="image/png" class="iconeInternetMedio" href="/icone/favicon-32x32.png"/>
<link rel="icon" type="image/png" class="iconeInternetMaior" href="/icone/favicon-96x96.png"/>
<link rel="icon" type="image/png" class="iconeInternetMenor" href="/icone/favicon-16x16.png"/>
<link rel="manifest" href="/icone/manifest.json"/>
<meta name="msapplication-TileColor" content="#ffffff"/>
<meta name="msapplication-TileImage" content="/icone/ms-icon-144x144.png"/>
<meta name="theme-color" content="#ffffff"/>
<title>Teste</title>
</head>
<ui:composition template="../css/Template.xhtml">
<ui:define name="coorpo">
<h:form id="superior">
<div class="labelsInsertTextBox">
<h:outputText id="kkk" value="#{controller.lb_Pesquisar}" style="position:absolute; top: 11.5%; color: #c0c0c0"/>
</div>
<p:inputText id="txt_nome" style="width: 70%; margin-left: 1%" onfocus="#{controller.limparLabel()}" immediate="true" value="" update="kkk"/>
</h:form>
</ui:define>
</ui:composition>
</html>
Java:
package br.com.click.controller;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIViewRoot;
import javax.faces.component.html.HtmlOutputText;
import javax.faces.context.FacesContext;
@ManagedBean(name = "controller")
@ViewScoped
public class Controller {
private String lb_Pesquisar = "Pesquisar";
public String getlb_Pesquisar() {
return lb_Pesquisar;
}
public void setlb_Pesquisar(String lb_Pesquisar) {
this.lb_Pesquisar = lb_Pesquisar;
}
public void limparLabel()
{
// TODO: inserir nome em alguma lista ou base de dados
FacesContext facesContext = FacesContext.getCurrentInstance();
UIViewRoot uiViewRoot = facesContext.getViewRoot();
HtmlOutputText ll = (HtmlOutputText) uiViewRoot.findComponent("superior:kkk");
ll.setValue("");
this.setlb_Pesquisar("");
}
}
Tenho três observações para fazer:
-
Você não está utilizando o nome das variáveis e métodos seguindo o CamelCase(Code Conventions), que é padrão no mundo java e na verdade em algumas outras linguagens, acredite, isso facilita a leitura do seu código para quem está acostumado com o Camel.
-
Você sabe pra que serve isso ? immediate=“true”… isso significa dizer que suas requisições iniciadas nesse componente não irão passar pelo controller, eles ignorarão algumas phases do JSF, ou seja, será executado somente as phases 1, 2 e 6, logo, seu método nem chamado está sendo, faça um teste colocando um debug nele.
-
Retire o immediate=“true” ou coloque immediate=“false” e teste para ver se resolve seu problema.
o immediate eu apenas estava testando de acordo com uns tutoriais semelhantes ao o que estava procurando na net, com ele ativado ou desativado não atingi o meu objetivo. que é simplesmente quando o meu input estiver em foco ele sumir o que estiver escrito no meu outputText ou outputLabel tanto faz. Muito obrigado pela informação por me poupar o trabalho de pesquisar sobre o immediate kkkkkk, gosto de pegar códigos e ir alterando seu comportamento pra aprender o que eles fazem. Entendo sobre o CamelCase esse projeto estou fazendo mais pra aprender web do que de fato deixa-lo digamos padronizado, da próxima vez ficarei mais atento a isso para que todo mundo compreenda meus códigos.
se é sumir no focus, tente assim:
dentro do seu p:inputText, crie a tag p:ajax
Assim:
<p:inputText id="txt_nome" style="width: 70%; margin-left: 1%" >
<p:ajax event="focus" listener="#{controller.limparLabel()}" update="kkk" />
</p:inputText>
Lembrando de tirar o immediate.
Faz tempo que não trabalho com JSF, mas que eu me lembre é quase isso que te passei.
resetei o servidor para ver se não era esse o problema, fiz uns testes até passei o event que me mostrou por parâmetro no meu método como ActionEvent, para ver se me dava alguma opção mas sem sucesso também. =/
Só pra atualizar o fórum, com botões realizo a tarefa perfeitamente e sem a necessidade de ajax tbm. Mas usando o ação de foco para executar o método da minha classe bean no inputText, ele não altera o valor do meu outputText nem com reza braba kkkkkk continuarei pesquisando o motivo disso…
Descobri o motivo de não mudar o valor do meu outputText. O inputText do primefaces não contém o comando update, descobri isso na documentação das propriedades do componente, porém ainda continuo com o meu problema como fazer ele atualizar o valor do meu outputText quando meu inputText estiver em foco?
Consegui solucionar o problema após varias tentativas, estive ocupado nos últimos dias por isso a demora. Porém pra quem estava tendo o mesmo problema que eu a solução é a seguinte. Eu apenas precisei criar outra variável na minha classe java para que ambas ficassem com values referenciados de forma diferente, após isso fazer o que o user rof20004 já havia me dito que finalmente deu certo deixo o código de forma mais enxuta para todo mundo ver. Obrigado a todos do fórum, segue em anexo o código:
Codigo .xhtml:
< html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:a=“http://java.sun.com/jsf/core”>
< head>
< meta http-equiv=“Content-Type” content=“text/html; charset=ISO-8859-1” />
< title>Teste< /title>
< /head>
< ui:composition template="…/css/Template.xhtml">
< ui:define name="coorpo">
< h:form>
<p:inputText id="txt_Nome" value="#{controller.txt_Pesquisar}" style="width: 70%; margin-left: 12%; margin-top: 6%">
<p:ajax event="focus" update="lb_pesquisa" listener="#{controller.limpar}" />
</p:inputText>
<h:outputText id="lb_pesquisa" value="#{controller.lb_Pesquisar}" style="position:absolute; top: 15.9%; left: 66%; color: #c0c0c0; font-family: cursive"/>
</h:form>
</ui:define>
< /ui:composition>
< /html>
Código .java:
package br.com.click.controller;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean(name = “controller”)
@ViewScoped
public class Controller {
private String lb_Pesquisar = "Pesquisar";
private String txt_Pesquisar = "";
public String getTxt_Pesquisar() {
return txt_Pesquisar;
}
public void setTxt_Pesquisar(String txt_Pesquisar) {
this.txt_Pesquisar = txt_Pesquisar;
}
public String getLb_Pesquisar() {
return lb_Pesquisar;
}
public void setLb_Pesquisar(String lb_Pesquisar) {
this.lb_Pesquisar = lb_Pesquisar;
}
public void limpar() {
lb_Pesquisar = "";
}
}