我在JScrollPane中有一个带有自定义html文档(不是来自URL)的JEditorPane和一个JTextField,以便用户可以输入文本,然后在编辑器窗格中突出显示。在textfield的keyPressed事件中,我在文档中搜索文本,用:
包围它<a name='spot'><span style='background-color: silver'>my text</span></a>
突出显示背景,然后将新文本设置为JEditorPane。这一切都很好,但我也想将窗格滚动到新突出显示的文本。因此,在编辑器窗格的documentListener的changedUpdate方法中,我添加了:
pane.scrollToReference("spot");
此调用在BoxView.modelToView中抛出ArrayIndexOutOfBoundsException。该方法在文本中找到我的“spot”引用,但我想也许视图尚未使用新文本进行更新,因此当它尝试在那里滚动时,它会失败。
我无法获得对该视图的引用,我似乎无法找到要监听的事件,这表示JEditorPane的视图已完全更新。有什么想法吗?
谢谢,
贾里德
答案 0 :(得分:3)
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) {
}
}
}