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

9 respostas
PauloBrito

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()?

9 Respostas

R

É 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().

T

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.

PauloBrito

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…

T

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.

PauloBrito

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.

R

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

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

package testeguj;

import javax.swing.JTextField;

public class JTextFieldPaulo extends JTextField {
  public JTextFieldPaulo() {
    setText("Paulo Brito");
    setEditable(false);
    setCaretPosition(0);
  }
}

- 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.

T

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.

PauloBrito

aff… “To beje”!

Valeu Roger! Vou experimentar!!

PauloBrito

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!

Criado 7 de maio de 2009
Ultima resposta 7 de mai. de 2009
Respostas 9
Participantes 3