Olá!
Estou desenvolvendo um ERP e nessa altura do campeonato, quando o sistema já está com milhares de campos, o cliente quer que quando um campo receba o foco, ele fique com todo o texto selecionado e não apenas o cursor do teclado sobre o primeiro como acontece por padrão.
Pensei em sobrescrever o jTextField, jFormattedTextField, etc… mas não sei se é uma boa nem se é possível. Alguém sugere algo?
Sobrescrever jTextField e outros campos
6 Respostas
Sobrescrever JTextField e JFormattedTextField certamente é uma saída, e não é nada difícil. Outro caminho é incluir uma chamada a selectAll() no evento focusGained() de cada componente individual dos seus formulários.
eh soh lah no focuslost faze como o cara ali de cima disse
aqui vai o nome do campo.selectAll();
Hum… acho que criar focus lost para cada campo não seria viável. Existem milhares (literalmente). Estive pensando em criar uma nova classe que extende o jButton e trocar em cada tela, mas ainda sim vai dar muito trabalho desnecessário. Realmente não existe nenhum outro jeito mais simples?
Você pode incluir no construtor de cada formulário da sua aplicação uma chamada à rotina abaixo, que instalará em cada JTextField o comportamento desejado:
public static void forcarSelecaoAoReceberFoco(Container containerInicial) {
// Correção de erro
if (containerInicial == null) {
return;
}
// Obtém os componentes do container
Component[] comps = containerInicial.getComponents();
if (comps != null) {
// Percorre os componentes do container
for (Component comp : comps) {
// O componente é um JTextField?
if (comp instanceof JTextField) {
// Instala um FocusListener para que todo o texto do JTextField
// seja selecionado quando o componente receber o foco
((JTextField) comp).addFocusListener(new FocusListener(){
public void focusGained(FocusEvent evt) {
Object source = evt.getSource();
if (source instanceof JTextField) {
((JTextField) source).selectAll();
}
}
public void focusLost(FocusEvent evt) {
// ... Nada a fazer ...
}
});
}
else {
// O componente também é um container? Percorre os componentes
// deste subcontainer
if (comp instanceof Container) {
forcarSelecaoAoReceberFoco((Container) comp);
}
}
}
}
}
Incluo neste post um programa de teste exemplificando a técnica. É um projeto criado no NetBeans 6.8 M2, usando a JDK 1.6.18-ea.
Acho que vou ter que fazer isso mesmo.
Agora preciso saber de uma coisa: se um campo já tem um listener para o focusLost, fazendo isso ele vai substituir ou ficar com dois?
Vai ficar com os dois. Você pode registrar quantos Listener’s quiser e precisar.