Sobrescrever jTextField e outros campos

6 respostas
lcn.andre

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?

6 Respostas

R

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.

AlissonGuj

eh soh lah no focuslost faze como o cara ali de cima disse

aqui vai o nome do campo.selectAll();

lcn.andre

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?

R

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.

lcn.andre

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?

R

Vai ficar com os dois. Você pode registrar quantos Listener’s quiser e precisar.

Criado 16 de outubro de 2009
Ultima resposta 20 de out. de 2009
Respostas 6
Participantes 3