Jay*_*667 4 html java swing jeditorpane hyperlink
我遇到了一个问题:我想在JEditorPane中使用内部锚点<a name="x">和链接<a href="#x">.
窗格的内容不是从资源加载,而是动态创建并作为String提供.
如何让我的JEditorPane滚动到正确的位置?(在示例中它应该滚动到顶部)侦听器只捕获null,这会增加问题.
这是我的SSCCCE:
public static void main(final String[] args) {
final JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
f.setTitle("JEditorPane Test");
final String text = "<html><body><a name='link1'>test</a>some text<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />some more text<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />some more text<a href='#link1'>jump to top</a></body></html>";
final JEditorPane ep = new JEditorPane();
ep.setContentType("text/html");
ep.setText(text);
ep.setEditable(false);
ep.addHyperlinkListener(new HyperlinkListener() {
@Override public void hyperlinkUpdate(final HyperlinkEvent pE) {
if (HyperlinkEvent.EventType.ACTIVATED == pE.getEventType())
System.out.println("ep link click: " + pE.getURL());
}
});
final JScrollPane sp = new JScrollPane(ep);
f.add(sp);
f.setBounds(200, 200, 400, 400);
f.setVisible(true);
}
Run Code Online (Sandbox Code Playgroud)
好的,我终于解决了这个问题.
我一直在测试scrollToReference(),但它不知何故不起作用.然后我玩了HTML解析和锚点和插入符号,setCaretPosition()有时只能工作.然后出于纯粹的巧合,我scrollToReference()再次包含在我的代码中并且滚动突然工作......并且仍然完美无瑕!
这是工作代码:
public static void main(final String[] args) {
final JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
f.setTitle("JEditorPane Test");
final String text = "<html><body><a name='link1'>test</a>some text<br /><a href='#thisisbottom'>down</a><br /><br /><br /><br /><br /><br /><br /><br /><br /><a name='mid1'></a>some more text<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />some more text [<a href='#link1'>jump to top</a>] <br /> or jump to <a name='thisisbottom' href='#mid1'>center</a></body></html>";
final JEditorPane ep = new JEditorPane();
ep.setContentType("text/html");
ep.setText(text);
ep.setEditable(false);
ep.addHyperlinkListener(new HyperlinkListener() {
@Override public void hyperlinkUpdate(final HyperlinkEvent pE) {
if (HyperlinkEvent.EventType.ACTIVATED == pE.getEventType()) {
System.out.println("JEditorPane link click: url='" + pE.getURL() + "' description='" + pE.getDescription() + "'");
String reference = pE.getDescription();
if (reference != null && reference.startsWith("#")) { // link must start with # to be internal reference
reference = reference.substring(1);
ep.scrollToReference(reference);
}
}
}
});
final JScrollPane sp = new JScrollPane(ep);
f.add(sp);
f.setBounds(200, 200, 400, 400);
f.setVisible(true);
}
Run Code Online (Sandbox Code Playgroud)