---
category: swing
folder: TitledBorderToolTip
title: TitledBorderのタイトルが省略されている場合はToolTipを表示する
tags: [TitledBorder, JToolTip, JLabel]
author: aterai
pubdate: 2015-09-28T01:33:50+09:00
description: TitledBorderのタイトルが設定したコンポーネントの幅より長くなって末尾の文字列が省略される場合、JToolTipでタイトル全体を表示します。
image: https://lh3.googleusercontent.com/-_haLcd_rxx8/VggXa21_nHI/AAAAAAAAOCo/FLlSmRfIUqo/s800-Ic42/TitledBorderToolTip.png
---
* 概要 [#summary]
`TitledBorder`のタイトルが設定したコンポーネントの幅より長くなって末尾の文字列が省略される場合、`JToolTip`でタイトル全体を表示します。

#download(https://lh3.googleusercontent.com/-_haLcd_rxx8/VggXa21_nHI/AAAAAAAAOCo/FLlSmRfIUqo/s800-Ic42/TitledBorderToolTip.png)

* サンプルコード [#sourcecode]
#code(link){{
JPanel panel1 = new JPanel() {
  private final JLabel label = new JLabel();
  @Override public String getToolTipText(MouseEvent e) {
    Border b = getBorder();
    if (b instanceof TitledBorder) {
      // int edge = 2; // EDGE_SPACING;
      TitledBorder titledBorder = (TitledBorder) b;
      Insets i = titledBorder.getBorderInsets(this);
      String title = titledBorder.getTitle();
      label.setFont(titledBorder.getTitleFont());
      label.setText(title);
      Dimension size = label.getPreferredSize();
      int labelX = i.left;
      int labelY = 0;
      int labelW = getSize().width - i.left - i.right;
      int labelH = i.top;
      if (size.width > labelW) {
        Rectangle r = new Rectangle(labelX, labelY, labelW, labelH);
        return r.contains(e.getPoint()) ? title : null;
      }
    }
    return null; // super.getToolTipText(e);
  }
};
panel1.setBorder(BorderFactory.createTitledBorder("aaaaa...aaaaa"));
panel1.setToolTipText("JPanel: dummy");
panel1.setToolTipText("JPanel");
}}

* 解説 [#explanation]
- `TitledBorder`を設定する`JPanel`の`getToolTipText(...)`メソッドをオーバーライド
-- サイズ計算用の仮`JLabel`に`TitledBorder`のフォントや文字列を設定してその幅を`getPreferredSize()`メソッドで取得
--- `TitledBorder`が内部で使用している`JLabel`は`private`なのでアクセスできない
-- 仮`JLabel`の幅が`TitledBorder`を設定した`JPanel`の幅より長い場合、文字列が省略されていると判断する
-- 上記に加えてマウスカーソルが`TitledBorder`の余白内(位置が`TOP`の場合)に存在する場合、`TitledBorder#getTitle()`で取得したタイトルを返すことで`JToolTip`を表示する
- 制限:
-- このサンプルはタイトルの位置が`TOP`の場合のみに対応
-- タイトルに`html`タグを使用して省略ではなく折り返しが発生する場合には未対応

* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JComponent.html#getToolTipText-java.awt.event.MouseEvent- JComponent#getToolTipText(MouseEvent) (Java Platform SE 8)]

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