---
category: swing
folder: LineSpacing
title: JEditorPaneやJTextPaneに行間を設定する
tags: [JEditorPane, JTextPane, StyledEditorKit]
author: aterai
pubdate: 2009-11-02T12:51:40+09:00
description: JEditorPaneやJTextPaneに行間を設定します。
image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTPYZn_u9I/AAAAAAAAAd4/5-1ThpWwM5U/s800/LineSpacing.png
---
* 概要 [#summary]
`JEditorPane`や`JTextPane`に行間を設定します。

#download(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTPYZn_u9I/AAAAAAAAAd4/5-1ThpWwM5U/s800/LineSpacing.png)

* サンプルコード [#sourcecode]
#code(link){{
class BottomInsetEditorKit extends StyledEditorKit {
  @Override public ViewFactory getViewFactory() {
    return new 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 javax.swing.text.ParagraphView(elem) {
              @Override protected short getBottomInset() {
                return 5;
              }
            };
          } 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);
      }
    };
  }
}
}}

* 解説 [#explanation]
- 上: `StyleConstants.setLineSpacing`で行間を指定した`AttributeSet`を作成し、`JTextPane#setParagraphAttributes`で設定
-- フォントサイズ相対の行間になる

#code{{
SimpleAttributeSet a = new SimpleAttributeSet();
StyleConstants.setLineSpacing(a, .5f);
// StyleConstants.setSpaceAbove(a, 5f);
// StyleConstants.setSpaceBelow(a, 5f);
// StyleConstants.setLeftIndent(a, 5f);
// StyleConstants.setRightIndent(a, 5f);
editor1.setParagraphAttributes(a, true);
setDummyText(editor1);
setSampleText(editor1);
}}

- 下: `ParagraphView#getBottomInset`をオーバーライドして固定の行間をピクセルで指定
-- フォントサイズに関係なくアキ`5px`

----
- スタイルシートで`line-height`を指定しても反映されない
-- `line-height`はモデル化されているが、現在は描画されない
-- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/text/html/CSS.html 対応しているCSSプロパティ一覧 - CSS (Java Platform SE 8)]
- ブロックレベルで`1`行だけ固定の行間を指定したい場合は`margin-bottom`が使用可能
#code{{
StyleSheet styleSheet = new StyleSheet();
styleSheet.addRule("body {font-size: 24pt; line-height: 2.0}");
styleSheet.addRule(".test {margin-bottom: 2pt; padding-bottom: 1px; }");
// XXX: styleSheet.addRule("span {color: white; display:inline-block; margin-bottom: 10pt;}");
HTMLEditorKit htmlEditorKit = new HTMLEditorKit();
htmlEditorKit.setStyleSheet(styleSheet);
editor1.setEditorKit(htmlEditorKit);
editor1.setText("<html><body><div class='test'>12<br />a<br />n<font size='32'>123<br />sd</font></div></body></html>");
}}

* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JTextPane.html#setParagraphAttributes-javax.swing.text.AttributeSet-boolean- JTextPane#setParagraphAttributes(...) (Java Platform SE 8)]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/text/CompositeView.html#getBottomInset-- CompositeView#getBottomInset() (Java Platform SE 8)]

* コメント [#comment]
#comment
#comment