JTextField - posição do cursor após inserir texto

Após inserir um texto maior que a largura de um jTextField, o que aparece são os últimos caracteres do texto, de forma que o cursor fique no último caractere. Porque isso? Como evitar este comportamento estranho sem ter que usar setCaretPosition()?

É tudo uma questão de ponto de vista… Esse comportamento pode parecer estranho para você, mas certamente era razoável para a equipe responsável pela criação do componente. Se você procura uma maneira prática de evitar isso, uma saída é criar uma classe derivada de JTextField onde setCaretPosition() sempre é chamado dentro de setText().

Na verdade esse comportamento que você citou é o esperado (experimente pegar um texto bem grande, copiá-lo para o clipboard (Ctrl+C), e então colá-lo em algum textfield de qualquer aplicação (talvez até a sua).

Você vai ver que só o fim do texto fica visível.

Obrigado pela resposta, thingol.

Este comportamento é esperado quando o usuário está lidando com o componente, mas não quando ele está sendo preparado… Como exemplos, imagine que eu vou mostrar um texto pro usuário, e o texto já tá no final… Agora imagine que o próprio usuário está digitando o texto, ou colando coisas, como você citou. Aí sim, faz sentido ir pro final.

Seria mais ou menos se, ao pesquisar no google, ele te mostrasse de cara o último resultado…

Ah, entendi.
Você quer usar um JTextField ou JTextArea para mostrar alguma coisa (como se fosse um <TEXTAREA> em uma página HTML.)
Nesse caso, é melhor mudar o caret para o começo mesmo. Se for para mostrar e o usuário não mexer, então adicionalmente você pode deixar setEditable (false), para melhor ressaltar que você quer só mostrar alguma coisa.
Como foi sugerido, nesses casos é melhor ter uma classe derivada de JTextField que já seja toda “customizada” para esses casos - setEditable (false), setCaretPosition (0) e outras coisas interessantes. Eu, por exemplo, também precisava setar a borda nesses casos.

Na verdade seria para edição mesmo… Sabe como é, o usuário vê os valores e edita o que achar necessário. Sobre customização, vou criar um Document para cada tipo informação na tela, para lidar com algumas coisas. Mas não achei onde lidar com o caret, a não ser via setCaretPosition(). É que estou usando o NetBeans, então estender um JTextField fica fora de mão.

Obrigado pelas repostas.

Fora de mão? :slight_smile: Há uma saída prática para isso, experimente o seguinte:

  • Crie no NetBeans uma classe chamada JTextFieldPaulo com o texto abaixo:

[code]package testeguj;

import javax.swing.JTextField;

public class JTextFieldPaulo extends JTextField {
public JTextFieldPaulo() {
setText(“Paulo Brito”);
setEditable(false);
setCaretPosition(0);
}
}
[/code]

  • Compile a classe;
  • Abra em modo de design o formulário em que quer incluir o JTextField customizado;
  • Na aba Projects do NetBeans, clique no nome da classe JTextFieldPaulo e arraste-o para dentro do formulário. Seu componente customizado será inserido automaticamente, como qualquer outro componente nativo do Swing.

De modo geral, no NetBeans você só precisa se lembrar que um componente customizado DEVE ter um construtor público sem parâmetros (igual ao “public JTextFieldPaulo()” que foi mostrado acima), senão o NetBeans não consegue criar o tal componente e visualizar no editor gráfico.

aff… “To beje”!

Valeu Roger! Vou experimentar!!

Perfeito! Melhor impossível… E eu que ignorava exemplos de extensão de classes de componentes visuais porque achava que só que cria frames “na mão” que ia poder usar…

Muito obrigado, Roger e thingol!