• title: JTextPaneにJSeparatorを追加する tags: [JTextPane, HTMLEditorKit, HTMLDocument, JSeparator, JLabel, MatteBorder] author: aterai pubdate: 2015-04-20T00:00:12+09:00 description: JTextPaneにセパレータとして、hr要素やJSeparator、MatteBorderを設定したJLabelなどを追加します。

概要

JTextPaneにセパレータとして、hr要素やJSeparatorMatteBorderを設定したJLabelなどを追加します。

サンプルコード

HTMLEditorKit kit = new HTMLEditorKit();
HTMLDocument doc = new HTMLDocument();
textPane.setEditorKit(kit);
textPane.setDocument(doc);
textPane.setEditable(false);
textPane.setText("<html>&lt;hr&gt;:<hr />");

textPane.insertComponent(new JLabel("JSeparator: "));
textPane.insertComponent(new JSeparator(JSeparator.HORIZONTAL));
insertBR(kit, doc);

textPane.insertComponent(new JLabel("MatteBorder1: "));
textPane.insertComponent(new JLabel() {
  @Override public void updateUI() {
    super.updateUI();
    setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, Color.RED));
  }
  @Override public Dimension getMaximumSize() {
    return new Dimension(textPane.getSize().width, 1);
  }
});
insertBR(kit, doc);

textPane.insertComponent(new JLabel("MatteBorder2: "));
textPane.insertComponent(new JLabel() {
  @Override public void updateUI() {
    super.updateUI();
    setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, Color.GREEN));
  }
  @Override public Dimension getPreferredSize() {
    return new Dimension(textPane.getSize().width, 1);
  }
  @Override public Dimension getMaximumSize() {
    return this.getPreferredSize();
  }
});
insertBR(kit, doc);

textPane.insertComponent(new JLabel("JSeparator.VERTICAL "));
textPane.insertComponent(new JSeparator(JSeparator.VERTICAL) {
  @Override public Dimension getPreferredSize() {
    return new Dimension(1, 16);
  }
  @Override public Dimension getMaximumSize() {
    return this.getPreferredSize();
  }
});
textPane.insertComponent(new JLabel(" TEST"));
View in GitHub: Java, Kotlin

解説

  • hr要素
    • htmlEditorKit.insertHTML(doc, doc.getLength(), "<hr />", 0, 0, null);などで、hr要素を追加
  • JSeparator
    • textPane.insertComponent(new JSeparator(JSeparator.HORIZONTAL));で水平JSeparatorを追加
  • MatteBorder1
    • MatteBorderを設定したテキスト無しのJLabelを追加
    • 最大サイズが(JTextPaneの幅×1)になるよう、JLabel#getMaximumSize()をオーバーライド
  • MatteBorder2
    • MatteBorderを設定したテキスト無しのJLabelを追加
    • 推奨サイズと最大サイズが(JTextPaneの幅×1)になるよう、JLabel#getPreferredSize()JLabel#getMaximumSize()をオーバーライド
  • JSeparator.VERTICAL
    • textPane.insertComponent(new JSeparator(JSeparator.VERTICAL));で垂直JSeparatorを追加
    • JLabel#getPreferredSize()JLabel#getMaximumSize()をオーバーライドしないと表示されない?

コメント