在JTextArea+JScrollPane中自定义滚动+插入符号行为



我在实现上述组件中我想要的行为时遇到了问题。我想要的行为是:
1)默认情况下,当新内容被附加到JTextArea时,它会自动滚动到最后插入的行。这个我成功地做到了:
DefaultCaret caret = (DefaultCaret)textArea.getCaret(); caret.setUpdatePolicy(DefaultCaret.NEVER_ALWAYS);
2)当用户使用鼠标或键盘移动滚动条时,应该禁用自动滚动,并显示用户滚动到的文本(这里我试图实现AdjustmentListener,其动作是设置DefaultCaret.NEVER_NEVER,但将其设置为NEVER后,我实际上再也不能滚动到某个地方了)
3)当用户将滚动条移动到最后插入的行时,应该恢复第1行提到的默认行为

唯一的是我看到这样做,以某种方式计算插入符号的位置取决于文档长度和滚动的当前位置,但说实话,我真的不喜欢这种方式。我想知道是否有一些其他的,更优雅和正确的方法做到这一点?

谢谢,Serhiy。

编辑:我发现非常类似的问题和答案,它与源代码的例子。

这不是一个完整的答案,但是评论区太有限了;-)

我的猜测是,如果你真的想要钩到滚动条行为,那么你必须玩得很脏,拦截ui安装的mousellistener,并将默认滚动条动作(在它的ActionMap中)与你自己的包装,并在那里实现插入符号策略的切换。

另一方面:我不确定你是否真的想要它:-)至少假设文本总是在末尾添加,因为自动滚动只发生在文本插入插入符号位置之前。你所有的用户都必须做
  • 用于停止自动滚动:将插入符号从末尾移开
  • 允许自动滚动:将插入符号移动到末尾

最新更新