Como evitar que o tratamento da chave de seta do JScrollPane mova o sinal de interpolação quando o Painel de rolagem envolver o painel de texto

Eu tenho os seguintes requisitos:

Eu preciso de um JTextPane rolável. O usuário pode digitar nesse painel de texto, ou o texto pode ser inserido nele que não é digitado pelo usuário. Pense em algo como uma janela de mensagens instantâneas. Embora a janela deva ser rolável para permitir que o usuário revise o texto digitado anteriormente, o cursor não deve se mover de sua posição no final do texto. Qualquer texto digitado pelo usuário sempre aparecerá no final.

No JTextPane, quando o usuário rola com a barra de rolagem, o cursor não se move. A janela de visualização é ajustada. No entanto, quando o usuário pressiona as teclas de seta para cima e para baixo, o cursor do JTextPane se move com ele (quer a janela role ou não).

O que eu quero é que uma tecla de seta para cima funcione da mesma maneira que mover a barra de rolagem para cima com o mouse. As teclas de seta não devem ter nada a ver com o cursor.

Eu tentei as seguintes abordagens, sem sucesso: 1) adicionar uma ação "No-op" para o mapa de teclado para minha classe de painel de texto (usando JTextPane.addKeymap () e Keymap.addActionForKeyStroke ()). Isso impede que o cursor se mova, mas impede que a ação seja passada para o Painel de rolagem para rolar a exibição. 2) remova as teclas de seta do mapa de teclado da minha classe de painel de texto. Isso afeta todos os JTextPanes no meu aplicativo, que não é o que eu quero.

O que eu quero é adicionar uma ação ao meu mapa de teclado TextPane que simplesmente chama a ação ScrollPane para a seta para cima e para baixo.

Qual é o melhor jeito de concluir isso?

Uma possibilidade que ocorre para mim é implementar um KeyListener (que recebe o toque de tecla antes do mapa de teclas) para interceptar essas chaves e implementar a rolagem manualmente. Mas isso parece exigir que eu calcule os tamanhos das fontes, etc. Existe uma maneira mais fácil?

O ideal seria se houvesse alguma maneira de "ancorar" o cursor em qualquer que fosse o final do texto.

questionAnswers(2)

yourAnswerToTheQuestion