【问题标题】:Maintaining previous position in an EditorPane when the text is refreshed刷新文本时保持 EditorPane 中的先前位置
【发布时间】:2011-07-03 05:59:42
【问题描述】:

这是困扰我多年的问题。用户正在滚动浏览包含在 JEditorPane 中的文本文档,而 JEditorPane 又包含在 JScrollPane 中。用户使用更改文本的按钮执行某些功能(它突出显示文本的某些部分)。然后我刷新 JeditorPane 中的文档以反映突出显示(使用 html 标记)。但是当我这样做时,文档会滚动回顶部。我希望文档保持在用户在采取行动之前所处的位置。请注意,用户没有选择文档中的任何文本,因此我无法滚动到选择点(如果选择了文本,该技术确实有效,但可惜在这种情况下我不能这样做)。如何保留 JScrollPane 中的位置并滚动到用户在执行操作之前所处的位置?

谢谢

【问题讨论】:

    标签: java swing scroll


    【解决方案1】:

    您可以使用 JViewport.scrollRectToVisible() 跳转到 JScrollPane 中文档的特定部分。您可以在使用 JViewPort.getViewRect() 执行操作之前对当前位置进行快照

    http://download.oracle.com/javase/6/docs/api/javax/swing/JViewport.html

    【讨论】:

      【解决方案2】:

      注意,用户没有选择文档中的任何文本,所以我无法滚动到选择点

      在更新前获取选择索引,然后调用setCaretPosition(previousStart),然后调用moveCaretPosition(previousEnd)

      【讨论】:

      • 正如我在最初的帖子中所述,没有插入符号的位置。文本未被选中。
      • @Elliott:您的插入符号位置是 0 还是视口外的某个位置?
      • 它总是为零,因为用户没有在 editorPane 中选择文本。
      【解决方案3】:

      你也可以使用:

      Point p = scrollPane.getViewport().getViewPosition();
      // do stuff
      scrollPane.getViewport().setViewPosition();
      

      【讨论】:

        【解决方案4】:

        我尝试了所有这些潜在的解决方案。不幸的是,无论出于何种原因,它们都不起作用。这是实际上为我解决问题的代码。

        /* 此代码在 JeditorPane 更新之前执行:*/

        int spoint = detailpane.scrollPane.getVerticalScrollBar().getValue();
        

        /* 然后将滚动恢复到更新前的位置,执行以下代码*/

                 SwingUtilities.invokeLater(new Runnable()
            {
            public void run()
            {
            detailpane.scrollPane.getVerticalScrollBar().setValue(spoint);
            }
            });
        

        /* 请注意,由于与 Swing 相关的通常的怪异不是线程安全的,因此您需要将 setValue 包含在 Runnable 中。 */

        【讨论】:

          猜你喜欢
          • 2021-04-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-12
          • 2012-10-21
          • 2011-07-31
          相关资源
          最近更新 更多