2012-12-27 61 views
3

我遇到了一個問題:我想在JEditorPane中使用內部錨點<a name="x">和鏈接<a href="#x">跳轉到JEditorPane中的內部錨點

窗格的內容不是從資源加載的,而是作爲字符串動態創建並可用的。

如何讓我的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); 
} 

回答

6

好吧,我終於得到這個解決。

我一直在用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>xyz<br /><br /><br />lol <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()) { 
       String desc = pE.getDescription(); 
       if (desc == null || !desc.startsWith("#")) return; 
       desc = desc.substring(1); 
       ep.scrollToReference(desc); 
      } 
     } 
    }); 

    final JScrollPane sp = new JScrollPane(ep); 
    f.add(sp); 
    f.setBounds(200, 200, 400, 400); 
    f.setVisible(true); 
} 
+0

哦,是的,這並不明顯,但JEditorPane控制了它的繞圈JScrollPane進行滾動。 – JayC667

+0

順便說一句,有沒有什麼辦法可以標記爲已解決?除了手動編輯標題? – JayC667

+1

是的,選擇你自己的答案爲接受(或解決問題的答案),這是如何標記爲在StackOverflow中解決。 – PhoneixS

1

你可以做到這一點是這樣的:

import java.awt.Point; 
import java.util.logging.Logger; 
import javax.swing.JEditorPane; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JViewport; 
import javax.swing.SwingUtilities; 
import javax.swing.event.HyperlinkEvent; 
import javax.swing.event.HyperlinkListener; 

public class PaneWithScroll { 
    private static final String TEXT = 
     "<html>" 
     + "<head>" 
     + "</head>" 
     + "<body>" 
      + "<p><a href=\"#top\">Go top</a></p>" 
     + "</body>" 
     + "</html>"; 
    private static final String TOP = "#top"; 

    public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
     JFrame frame = new PaneWithScrollFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
     } 
    }); 
    } 

    private static class PaneWithScrollFrame extends JFrame { 
    private PaneWithScrollFrame() { 
     super.setName("Pane With Scroll"); 
     this.addComponents(); 
     super.setSize(640, 480); 
    } 

    private void addComponents() { 
     JEditorPane editorPane = new JEditorPane(); 
     editorPane.setContentType("text/html"); 
     editorPane.setEditable(false); 
     editorPane.setText(TEXT); 

     final JScrollPane scrollpane = new JScrollPane(editorPane); 

     editorPane.addHyperlinkListener(new HyperlinkListener() { 
     @Override 
     public void hyperlinkUpdate(HyperlinkEvent e) { 
      if (HyperlinkEvent.EventType.ACTIVATED.equals(e.getEventType())) { 
      String description = e.getDescription(); 
      if (TOP.equals(description)) { 
       JViewport viewport = scrollpane.getViewport(); 
       viewport.setViewPosition(new Point(0, 0)); 
      } 
      } 
     } 
     }); 

     super.add(scrollpane); 
    } 
    } 
} 
+0

非常感謝您對這個輸入,它已經幫助了一點。但我正在尋找更通用的解決方案。 感謝您的文章,我實際上找到了一個,會發布在下面。 – JayC667