Como posso obter o comprimento do conteúdo de um JTextField como os tipos de usuário?

StackOverflow https://stackoverflow.com/questions/401598

  •  03-07-2019
  •  | 
  •  

Pergunta

JTextField tem um evento keyTyped mas parece que no momento em que dispara o conteúdo da célula ainda não mudaram.

Por causa disso .length () é sempre errado se ler aqui.

Deve haver uma maneira simples de obter o comprimento como ele aparece para o usuário após um acidente vascular cerebral chave?

Foi útil?

Solução

Isto não é provavelmente a melhor maneira (e ele tem sido um tempo), mas, no passado, eu adicionei um DocumentListener ao JTextField e em qualquer um dos eventos (insert, update, remove) I:

evt.getDocument().getLength()

Que retorna o comprimento total do conteúdo do campo de texto.

Outras dicas

Isso pode estar relacionado a este "bug" (ou melhor, "recurso" )

Os ouvintes são notificados dos principais eventos antes de processá-los para permitir que os ouvintes para "roubar" os eventos por consumi-los. Isto dá compatibilidade com a noção awt mais velho de consumir eventos.
O "digitado" evento não texto média foi celebrado o componente . Este não é um bug, pretende-se comportamento.

Uma solução possível é para ouvir um associado Documento

// Listen for changes in the text
myTextField.getDocument().addDocumentListener(new DocumentListener() {
  public void changedUpdate(DocumentEvent e) {
  // text was changed
}
public void removeUpdate(DocumentEvent e) {
  // text was deleted
}
public void insertUpdate(DocumentEvent e) {
  // text was inserted
}
});

Note que este funciona, não importa como o texto é alterado; através de um corte prancheta / colar "setText ()" progamatic na TextField ou a digitação do usuário no campo na interface do usuário.

KeyEvents são eventos de baixo nível que não são apropriados aqui [isso soa familiar].

Como o sistema JTextField saber que um personagem tenha sido digitado? Através de um evento digitado chave (IIRC, feito através do PL & F). Será que o evento se despachado para o ouvinte sistema antes de seu ouvinte? Ele pode ou não fazer.

Neste caso, você provavelmente vai querer ir para o Document e adicionar um ouvinte de nível superior. Com balanço é uma boa idéia ir para o modelo inicial - interfaces de classe 'J' são incoerentes. Se você está interceptando dados de entrada, então você provavelmente vai querer um modelo personalizado (ou no caso de Document um DocumentFilter).

Use este código:

public void jTextField6KeyReleased(java.awt.event.KeyEvent evt)
{
    System.out.println(jTextField6.getText().length());
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top