概要

JEditorPaneのパラグラフ終了位置に改行を意味する図形を追加表示します。Swing - JTextPane View Problemから、ソースコードの大部分を引用しています。

サンプルコード

class MyEditorKit extends StyledEditorKit {
  @Override public ViewFactory getViewFactory() {
    return new MyViewFactory();
  }
}

class MyViewFactory implements ViewFactory {
  @Override public View create(Element elem) {
    String kind = elem.getName();
    if (kind != null) {
      if (kind.equals(AbstractDocument.ContentElementName)) {
        return new LabelView(elem);
      } else if (kind.equals(AbstractDocument.ParagraphElementName)) {
        return new ParagraphWithEopmView(elem);
      } else if (kind.equals(AbstractDocument.SectionElementName)) {
        return new BoxView(elem, View.Y_AXIS);
      } else if (kind.equals(StyleConstants.ComponentElementName)) {
        return new ComponentView(elem);
      } else if (kind.equals(StyleConstants.IconElementName)) {
        return new IconView(elem);
      }
    }
    return new LabelView(elem);
  }
}

class ParagraphWithEopmView extends ParagraphView {
  private static final Color pc = new Color(120, 130, 110);
  public ParagraphWithEopmView(Element elem) {
    super(elem);
  }

  @Override public void paint(Graphics g, Shape allocation) {
    super.paint(g, allocation);
    paintCustomParagraph(g, allocation);
  }

  private void paintCustomParagraph(Graphics g, Shape a) {
    try {
      Shape paragraph = modelToView(
          getEndOffset(), a, Position.Bias.Backward);
      Rectangle r = (paragraph == null) ? a.getBounds()
                                        : paragraph.getBounds();
      int x = r.x;
      int y = r.y;
      int h = r.height;
      Graphics2D g2 = (Graphics2D) g.create();
      g2.setColor(MARK_COLOR);
      // paragraph mark
      g2.drawLine(x + 1, y + h / 2, x + 1, y + h - 4);
      g2.drawLine(x + 2, y + h / 2, x + 2, y + h - 5);
      g2.drawLine(x + 3, y + h - 6, x + 3, y + h - 6);
      g2.dispose();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
View in GitHub: Java, Kotlin

解説

  • StyledEditorKitを継承するEditorKitを作成し、これをJEditorPane#setEditorKitメソッドでJEditorPaneに設定
  • このEditorKitElementがパラグラフ(AbstractDocument.ParagraphElementName)の場合、改行記号を末尾に追加で描画するViewを返すViewFactoryを生成

参考リンク

コメント