概要

ツールチップを使って、JTabbedPaneのサムネイルを表示します。

サンプルコード

class TabThumbnailTabbedPane extends JTabbedPane {
  private int current = -1;
  private static final double SCALE = .15;
  private Component getTabThumbnail(int index) {
    Component c = getComponentAt(index);
    Icon icon = null;
    if (c instanceof JScrollPane) {
      c = ((JScrollPane) c).getViewport().getView();
      Dimension d = c.getPreferredSize();
      int newW = (int) (d.width  * SCALE);
      int newH = (int) (d.height * SCALE);
      BufferedImage image = new BufferedImage(
          newW, newH, BufferedImage.TYPE_INT_ARGB);
      Graphics2D g2 = image.createGraphics();
      g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                          RenderingHints.VALUE_INTERPOLATION_BILINEAR);
      g2.scale(SCALE, SCALE);
      c.paint(g2);
      g2.dispose();
      icon = new ImageIcon(image);
    } else if (c instanceof JLabel) {
      icon = ((JLabel) c).getIcon();
    }
    return new JLabel(icon);
  }

  @Override public JToolTip createToolTip() {
    int index = current;
    if (index < 0) {
      return null;
    }

    JPanel p = new JPanel(new BorderLayout());
    p.setBorder(BorderFactory.createEmptyBorder());
    p.add(new JLabel(getTitleAt(index)), BorderLayout.NORTH);
    p.add(getTabThumbnail(index));

    JToolTip tip = new JToolTip() {
      @Override public Dimension getPreferredSize() {
        Insets i = getInsets();
        Dimension d = p.getPreferredSize();
        return new Dimension(
            d.width + i.left + i.right, d.height + i.top + i.bottom);
      }
    };
    tip.setComponent(this);
    LookAndFeel.installColorsAndFont(
        p, "ToolTip.background", "ToolTip.foreground", "ToolTip.font");
    tip.setLayout(new BorderLayout());
    tip.add(p);
    return tip;
  }

  @Override public String getToolTipText(MouseEvent e) {
    int index = indexAtLocation(e.getX(), e.getY());
    String str = (current == index) ? super.getToolTipText(e) : null;
    current = index;
    return str;
  }
}
View in GitHub: Java, Kotlin

解説

  • 選択されたタブではなく、マウスカーソルが存在するタブコンテンツの内部コンポーネントを縮小してBufferedImageを作成
  • 縮小したBufferedImageからImageIconを作成、JLabel#setIcon(...)でコンポーネントに変換してJToolTipに配置

参考リンク

コメント