JEditorPane内のリンク参照位置までスクロールする
Total: 1743
, Today: 1
, Yesterday: 0
Posted by aterai at
Last-modified:
概要
JEditorPane
のHTMLDocument
内に配置されたリンクのアンカータグが表示される位置までスクロールします。
Screenshot
Advertisement
サンプルコード
HTMLEditorKit htmlEditorKit = new HTMLEditorKit();
JEditorPane editor = new JEditorPane();
editor.setEditable(false);
editor.setEditorKit(htmlEditorKit);
HTMLDocument doc = (HTMLDocument) editor.getDocument();
String tag = "<a name='%s'>%s</a>";
doc.insertBeforeEnd(element, String.format(tag, ref, ref));
tree.addTreeSelectionListener(e -> {
Object o = e.getNewLeadSelectionPath().getLastPathComponent();
if (o instanceof DefaultMutableTreeNode) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) o;
String ref = Objects.toString(node.getUserObject());
editor.scrollToReference(ref);
}
});
View in GitHub: Java, Kotlin解説
JTree
のノードが選択されるとそのノードのUserObject
と一致する<a>
アンカータグのname
属性をもつリンクをまでJEditorPane#scrollToReference(ref)
メソッドを使用してビューをスクロールするid
属性やhref
属性などを指定してもJEditorPane#scrollToReference(ref)
メソッドでは効果がない
bottom
ボタンをクリックすると、ドキュメントの末尾に記述した<p id='bottom'>
タグが表示される位置までスクロールJEditorPane#scrollToReference(ref)
メソッドの実装を参考にして、HTMLElement#getElement(id)
メソッドでid
がbottom
のElement
を検索してその位置までJEditorPane#scrollRectToVisible(...)
メソッドでスクールするメソッドを作成
private static void scrollToId(JEditorPane editor, String id) {
Document d = editor.getDocument();
if (d instanceof HTMLDocument) {
HTMLDocument doc = (HTMLDocument) d;
Element element = doc.getElement(id);
try {
int pos = element.getStartOffset();
Rectangle r = editor.modelToView(pos);
if (r != null) {
Rectangle vis = editor.getVisibleRect();
r.height = vis.height;
editor.scrollRectToVisible(r);
editor.setCaretPosition(pos);
}
} catch (BadLocationException ex) {
UIManager.getLookAndFeel().provideErrorFeedback(editor);
}
}
}
参考リンク
- JEditorPane (Java Platform SE 8)
- JScrollPane内にあるJTableなどで追加した行が可視化されるようにスクロールする
- JTreeとCardLayoutでサイドメニューを作成する