概要

TitledBorderのタイトルが設定したコンポーネントの幅より長くなって末尾の文字列が省略される場合、JToolTipでタイトル全体を表示します。

サンプルコード

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");
View in GitHub: Java, Kotlin

解説

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

参考リンク

コメント