【问题标题】:Text area can't scroll properly with caret使用插入符号无法正确滚动文本区域
【发布时间】:2019-02-15 08:35:32
【问题描述】:

我使用 JTextArea 进行简单聊天程序的聊天,并添加了一个插入符号,以便在向其附加文本时自动滚动。这引发了当聊天被大量使用时用户无法滚动的问题。

我已尝试查看插入符号的选项,并查看了滚动窗格选项,但是当用户滚动时没有向下滚动。

我打算允许用户滚动,但不会因为有人发送消息而立即向下滚动。理想的情况是它像 Discord 一样工作,只有当用户一直向下滚动或类似的东西时它才会向下滚动。

【问题讨论】:

  • 你必须做出一些决定。如果插入符号位于结束位置,那么您可以假设应该发生滚动,否则不要
  • 是否有一种方法可以让我控制何时向下滚动?
  • 可能,但您几乎会遇到所有想向下滚动但不知道原因的事件。如果插入符号不在文档末尾,最好不要更新更新插入符号的位置

标签: java swing jtextarea


【解决方案1】:

理想的情况是它像 Discord 一样工作,只有当用户一直向下滚动或类似的东西时它才会向下滚动。

查看Smart Scrolling。它在滚动条上添加一个AdjustmentListener 来控制滚动:

  1. 当滚动条位于底部时,它将继续自动滚动。

  2. 当它不在底部时,它不会滚动。用户需要滚动到底部才能重新激活自动滚动。

【讨论】:

    【解决方案2】:

    我的推荐与 Camickr 的相似。向滚动条添加一个更改监听器,并根据用户是否滚动到底部来启用/禁用插入符号移动。如果滚动条处于最大值,则启用插入符号移动。如果不是,则将其禁用。

    YourJScrollPane.getVerticalScrollBar().getModel().addChangeListener()
    {
       //Override stateChanged(ChangeEvent e) With Caret Movement Switch
    }
    

    通过调用模型(即 BoundedRangeModel)的范围、值和最大范围来检测和比较当前滚动条位置。

    https://docs.oracle.com/javase/7/docs/api/javax/swing/BoundedRangeModel.html

    /*Where to find the needed scrollbar position values*/
    YourJScrollPane.getVerticalScrollBar().getModel().getExtent()
    YourJScrollPane.getVerticalScrollBar().getModel().getValue()
    YourJScrollPane.getVerticalScrollBar().getModel().getMaximum() //Bottom Position
    
    /*Pseudocode*/
    if (Value + Extent == Maximum)
    {
        /*Enable Caret Movement - User is at bottom of page*/ 
    }
    else
    {
        /*Disable Caret Movement - User is not at bottom of page*/
    }
    

    在下方评论任何改进或建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 2011-05-26
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多