JTabbedPaneのタブを等幅にしてタイトルをクリップ

編集者:Terai Atsuhiro
作成日:2005-08-08
更新日:2022-12-16 (金) 13:56:00

概要

JTabbedPaneのタブを等幅にし、長いタイトルはクリップして表示します。

http://terai.xrea.jp/swing/clippedtitle/screenshot.png

サンプルコード

tab1.setUI(new javax.swing.plaf.basic.BasicTabbedPaneUI() {
  protected int calculateTabWidth(int tabP, int tabIdx, FontMetrics m) {
    int i = tabPane.getTabCount();
    Insets insets = tabPane.getInsets();
    int width = tabPane.getWidth()-insets.left-insets.right;
    return (int)(width/i)-2;
  }
  protected void paintText(Graphics g, int tabPlacement,
      Font font, FontMetrics metrics, int tabIndex,
      String title, Rectangle textRect, 
      boolean isSelected) {
    Rectangle tabRect = rects[tabIndex];
    String clippedText = SwingUtilities.layoutCompoundLabel(
      (JComponent) tabPane,
      metrics, title, getIconForTab(tabIndex),
      SwingUtilities.CENTER,
      SwingUtilities.CENTER,
      SwingUtilities.CENTER,
      SwingUtilities.TRAILING,
      tabRect,
      new Rectangle(),
      textRect,
      textIconGap);
      super.paintText(g, tabPlacement, font, metrics,
                      tabIndex, clippedText, textRect, isSelected);
}

解説

上記のサンプルでは、すべてのタブ幅が等しくなるようにし*1、この幅よりタイトルが長い場合は、SwingUtilities.layoutCompoundLabelメソッドで文字列をクリップして表示しています。タイトルがクリップされていても、ツールチップで元の文字列を表示することができます。

コメント