2012-04-10 1 views
2

JScrollPane 내부에 사용자 정의 html 문서 (URL이 아닌)와 JTextField가있는 JEditorPane이 있으므로 편집기 창에서 강조 표시 할 텍스트를 사용자가 입력 할 수 있습니다. 다음 배경을 강조JEditorPane에서 Java scrollToReference 예외가 발생합니다.

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

JEditorPane의에 새 텍스트를 설정 : 텍스트 필드의의 keyPressed 이벤트에서, 나는 그것이로 둘러싸고, 텍스트에 대한 문서를 검색 할 수 있습니다. 이 모든 것은 정상적으로 작동하지만 새로 강조 표시된 텍스트로 창을 스크롤하려고합니다. 편집기 창의의 DocumentListener의 해, ChangedUpdate 방법에 그래서, 나는 추가 :

pane.scrollToReference("spot"); 

이 호출은 BoxView.modelToView 내부는, ArrayIndexOutOfBoundsException가 발생합니다. 이 메소드는 텍스트에서 내 "스팟"참조를 찾습니다. 그러나 뷰가 아직 새 텍스트로 업데이트되지 않았다고 생각합니다. 따라서 스크롤 할 때 실패합니다.

뷰에 대한 참조를 가져올 수 없으며 수신 대기 이벤트를 찾을 수 없어서 JEditorPane의 뷰가 완전히 업데이트되었음을 ​​나타냅니다. 어떤 아이디어?

감사합니다,

자레드

+0

을 보여 주위의 모든 예는 HTMLEditorKit의 유형에서, 귀하의 질문을 [SSCCE] (http : // ssc ce.org/)에 의해'ArrayIndexOutOfBoundsException'이 발생했습니다 – mKorbel

+0

HtmlEditorKit을 변경하지 않았으므로 JEditorPane의 기본값이 무엇이든간에. SSCCE가없는 – Jared

+0

고객님의 문제를 발견 할 수 없으므로 미안하지만 배터리가 포함되어 있지 않을 수도 있습니다. – mKorbel

답변

3

JScrollPane#scrollToReference(java.lang.String reference) URL을 문자열 referennce 이야기,

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) { 
     } 
    } 
} 
+0

메소드에 전달 된 인수는 html 문서 내의 앵커의 "name"속성을 참조해야합니다. 메서드를 호출하는 방식은 문제가 아닙니다. 내가 디버거에서 메소드를 밟았 기 때문에 이것을 알았고 내 참조 앵커를 올바르게 배치했습니다. 또한, 나는 scrollRectToVisible이라고 불리는 참조를 직접 찾았고, 동일한 오류가 발생했습니다. – Jared

+0

나는 더 이상 당신을 도울 수 없어요. – mKorbel