読者です 読者をやめる 読者になる 読者になる

ちらつかない JEditorPane クラス の setText メソッド

Java

JEditorPane クラス の setText メソッド

public void setText(String t) {
  try {
    Document doc = getDocument();
    doc.remove(0, doc.getLength());
    if (t == null || t.equals("")) {
      return;
    }
    Reader r = new StringReader(t);
    EditorKit kit = getEditorKit();
    kit.read(r, doc, 0);
  } catch (IOException ioe) {
    UIManager.getLookAndFeel().provideErrorFeedback(JEditorPane.this);
  } catch (BadLocationException ble) {
    UIManager.getLookAndFeel().provideErrorFeedback(JEditorPane.this);
  }
}

のように実装されていて、いったんドキュメントをクリア

    Document doc = getDocument();
    doc.remove(0, doc.getLength());

してから、kit.read(r, doc, 0); する仕様です。


このせいで、Timer 中で回したりしていると、クリアしている部分が見えてしまうことがあって、画面がちらついてしまいます。
というわけで、

class ExtJEdit extends JEditorPane {
  public void setText(String t) {
    if (t == null || t.equals("")) {
      return;
    }
    Reader r = new StringReader(t);
    HTMLDocument doc = new HTMLDocument();
    HTMLEditorKit kit = new HTMLEditorKit();
    try {
      kit.read(r, doc, 0);
      this.setDocument(doc);
    } catch (IOException e) {
      UIManager.getLookAndFeel().provideErrorFeedback(this);
    } catch (BadLocationException e) {
      UIManager.getLookAndFeel().provideErrorFeedback(this);
    }
  }
}

こんな感じに変更してみたところ、ほぼちらつかなくなりました。

サンプル



ちらつかない場合もあるので、適当にボタンを押しまくってください。