[Resolvido] Seleciona o texto de todos os Jframes ao ganhar foco

5 respostas
kinmaster3

Boa noite,

Minha dúvida é a seguinte: Preciso fazer um jTextField selecione todo o seu conteúdo ao ganhar foco, e remova a seleção ao perder o foco. A solução seria simples:

private void nomedoCampoFocusGained(java.awt.event.FocusEvent evt) {                                   
    nomedoCampo.selectAll();//Entrou em foco, selecionou todo o texto
}

private void nomedoCampoFocusLost(java.awt.event.FocusEvent evt) {                                 
    nomedoCampo.setSelectionEnd(0);//saiu do foco, perdeu a seleção
}

Porém, eu tenho em torno de 67 campos de texto na minha aplicação e adaptar o código acima para cada uma daria um trabalho tremendo.
Existe alguma classe em java que controle o ganho e perda de foco dentro de um jFrame, e que seja possível inserir o código acima nela? Ou, na hipótese mais árdua, outra forma mais simples de realizar essa tarefa?

5 Respostas

Rafael_Romao_Bertoni

Não dá para usar polimorfismo?

A

Percorrer toda a arvore de elementos recursivamente buscando os JTextField’s seria uma forma. Porem não acho que isso seja muito elegante se vc quiser aplicar isso em toda a sua aplicação. Para fazer isso você pode usar algo como o algoritmo abaixo:

public void insertEvent(Container contentPane) {
    final FocusAdapter event = new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent e) {
            JTextField source = (JTextField) e.getSource();
            source.selectAll();
        }
    };
    for (Component component : contentPane.getComponents()) {
        if (component instanceof JTextField) {
            JTextField jtf = (JTextField) component;
            jtf.addFocusListener(event);
        } else if (component instanceof Container) {
            insertEvent((Container) component);
        }
    }
}
kinmaster3

Comecei estudando a dica do Rafael mas fiquei muito perdido, então vou utilizar o código do Allan como ponto de partida. Desde já agradeço pela ajuda, vou estudar esse material e assim que conseguir algum resultado positivo retornarei com a solução.

A

Assim como o Rafael_Romao_Bertoni falou você tambem pode usar polimorfismo.
Crie a seguinte classe que herdara de JTextField e toda vez que precisar usar ela vc vai arrastar não da palheta mas da propria classe do Netbeans para dentro do painel (Caso vc esteja realmente usando o NetBeans). Isso realmente funciona o Netbeans entende que esta classe é uma subclasse de Component e coloca no painel normalmente como se estivesse vindo da palheta.

Segue o codigo:

public class MyJTextField extends JTextField implements FocusListener {

public MyJTextField() {
    this.addFocusListener(this);
}

@Override
public void focusGained(FocusEvent e) {
    this.selectAll();
}

@Override
public void focusLost(FocusEvent e) {
}

}

kinmaster3

Obrigado pela ajuda. Resolveu meu problema.

Criado 1 de abril de 2016
Ultima resposta 22 de abr. de 2016
Respostas 5
Participantes 3