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

时间:2011-08-30 09:09:19

标签: java swing jscrollpane behavior jtextarea

我在提到的组件中实现我想要的行为时遇到问题。我想要的行为是:1)默认情况下,当新内容附加到JTextArea时,它会自动滚动到最后插入的行。我设法做的这个:
DefaultCaret caret = (DefaultCaret)textArea.getCaret(); caret.setUpdatePolicy(DefaultCaret.NEVER_ALWAYS);
2)当用户使用鼠标或使用键盘移动滚动条时,应禁用自动滚动并显示用户滚动的文本(此处我尝试实现AdjustmentListener,其中正在设置DefaultCaret.NEVER_NEVER但在将其设置为从来没有,我实际上可能永远不会滚动到某个地方) 3)当用户将滚动条移动到最后插入的行时,应重新记录第1行中提到的默认行为

我唯一能看到这样做是以某种方式根据文件长度和滚动的当前位置计算插入位置,但说实话我并不喜欢这种方式。我想知道是否还有其他更优雅,更正确的方法呢?

谢谢,Serhiy。

编辑:我发现源代码示例的问题和答案非常相似。可以找到答案here

1 个答案:

答案 0 :(得分:2)

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

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

另一方面:我不确定你真的想要它:-)至少假设文本总是在最后添加,因为只有在之前插入文本时才会发生自动滚动插入符号位置。您的所有用户都必须

  • 用于停止自动滚动:将插入符号从末尾移开
  • 允许自动滚动:将插入符号移到最后