2012-04-10 5 views
2

JScrollPane内のカスタムhtmlドキュメント(URLからではありません)とJTextFieldを持つJEditorPaneを使用して、エディタペインでハイライト表示されるテキストをユーザーが入力できるようにします。 JEdi​​torPaneのに新しいテキストを設定し、その後、背景を強調するためにJEditorPaneでJava scrollToReference例外が発生する

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

:テキストフィールドのkeyPressedイベントでは、私はテキストの文書を検索する、とそれを囲みます。これはすべて正常に動作しますが、ペインを新しく強調表示されたテキストにスクロールします。だから、エディタペインのdocumentListenerののchangedUpdate方法では、私が追加:

pane.scrollToReference("spot"); 

この呼び出しはBoxView.modelToView内部には、ArrayIndexOutOfBoundsExceptionがスローされます。このメソッドはテキスト内に「スポット」参照を見つけますが、おそらくビューが新しいテキストで更新されていない可能性があるので、そこでスクロールしようとすると失敗します。

ビューへの参照を取得できません。JEditorPaneのビューが完全に更新されたことを示すリッスンするイベントが見つからないようです。何か案は?

おかげで、

ジャレッド

+0

を示すの周りのすべての例のHTMLEditorKitのタイプから、あなたの質問を[SSCCE](http:// ssc ce.org/)が原因で 'ArrayIndexOutOfBoundsException'が発生しました – mKorbel

+0

私はHtmlEditorKitを変更していないので、JEditorPaneのデフォルトは何ですか。 – Jared

答えて

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

関連する問題