【问题标题】:Java scrollToReference causes exception in JEditorPaneJava scrollToReference 在 JEditorPane 中导致异常
【发布时间】:2012-04-22 22:55:06
【问题描述】:

我在 JScrollPane 中有一个带有自定义 html 文档(不是来自 URL)的 JEditorPane,还有一个 JTextField,以便用户可以输入文本,然后在编辑器窗格中突出显示该文本。在文本字段的 keyPressed 事件中,我在文档中搜索文本,将其包围:

<a name='spot'><span style='background-color: silver'>my text</span></a> 

突出显示背景,然后将新文本设置为 JEditorPane。这一切都很好,但我也想将窗格滚动到新突出显示的文本。所以在编辑器窗格的documentListener的changedUpdate方法中,我添加了:

pane.scrollToReference("spot"); 

此调用在 BoxView.modelToView 内引发 ArrayIndexOutOfBoundsException。该方法在文本中找到我的“点”引用,但我在想也许视图还没有用新文本更新,所以当它试图滚动到那里时,它失败了。

我无法获得对视图的引用,而且我似乎找不到要监听的表示 JEditorPane 的视图已完全更新的事件。有什么想法吗?

谢谢,

贾里德

【问题讨论】:

  • 从哪种类型的 HtmlEditorKit 中,最好用SSCCE 更新您的问题引起ArrayIndexOutOfBoundsException
  • 我没有更改任何 HtmlEditorKit,所以无论 JEditorPane 的默认值是什么。
  • 没有 SSCCE 我无法找到您的问题,抱歉不包括电池,也许有人可以...

标签: java swing jeditorpane


【解决方案1】:

JScrollPane#scrollToReference(java.lang.String reference) 谈论对 URL 的字符串引用,

Scrolls the view to the given reference location (that is, the value 
returned by the UL.getRef method for the URL being displayed).

然后所有示例都显示以下解决方法

import java.io.IOException;
import java.net.URL;
import javax.swing.JDialog;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;

public class MyScrollToReference extends JDialog {
    private static final long serialVersionUID = 1L;

    public MyScrollToReference(JFrame frame, String title, boolean modal, String urlString) {
        super(frame, title, modal);

        try {
            final URL url = MyScrollToReference.class.getResource(urlString);
            final JEditorPane htmlPane = new JEditorPane(url);
            htmlPane.setEditable(false);
            JScrollPane scrollPane = new JScrollPane(htmlPane);
            getContentPane().add(scrollPane);
            htmlPane.addHyperlinkListener(new HyperlinkListener() {

                public void hyperlinkUpdate(HyperlinkEvent e) {
                    if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
                        if (e.getURL().sameFile(url)) {
                            try {
                                htmlPane.scrollToReference(e.getURL().getRef());
                            } catch (Throwable t) {
                                t.printStackTrace();
                            }
                        }
                    }
                }
            });
        } catch (IOException e) {
        }
    }
}

【讨论】:

  • 传递给该方法的参数应该引用 html 文档中锚点的“名称”属性。我调用该方法的方式不是问题。我知道这一点是因为我在调试器中逐步完成了该方法,并且它正确地定位了我的参考锚点。另外,我自己搜索了引用,然后调用了scrollRectToVisible,也出现了同样的错误,
  • 帮不了你了,没用过,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多