我在实现上述组件中我想要的行为时遇到了问题。我想要的行为是:
1)默认情况下,当新内容被附加到JTextArea时,它会自动滚动到最后插入的行。这个我成功地做到了:DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.NEVER_ALWAYS);
2)当用户使用鼠标或键盘移动滚动条时,应该禁用自动滚动,并显示用户滚动到的文本(这里我试图实现AdjustmentListener,其动作是设置DefaultCaret.NEVER_NEVER
,但将其设置为NEVER后,我实际上再也不能滚动到某个地方了)
3)当用户将滚动条移动到最后插入的行时,应该恢复第1行提到的默认行为
唯一的是我看到这样做,以某种方式计算插入符号的位置取决于文档长度和滚动的当前位置,但说实话,我真的不喜欢这种方式。我想知道是否有一些其他的,更优雅和正确的方法做到这一点?
谢谢,Serhiy。
编辑:我发现非常类似的问题和答案,它与源代码的例子。
这不是一个完整的答案,但是评论区太有限了;-)
我的猜测是,如果你真的想要钩到滚动条行为,那么你必须玩得很脏,拦截ui安装的mousellistener,并将默认滚动条动作(在它的ActionMap中)与你自己的包装,并在那里实现插入符号策略的切换。
另一方面:我不确定你是否真的想要它:-)至少假设文本总是在末尾添加,因为自动滚动只发生在文本插入在插入符号位置之前。你所有的用户都必须做- 用于停止自动滚动:将插入符号从末尾移开
- 允许自动滚动:将插入符号移动到末尾