概要

JScrollPaneから縦JScrollBarを取得し、そのノブ上にアイコンを追加表示します。

サンプルコード

class BasicIconScrollBarUI extends BasicScrollBarUI {
  @Override protected void paintThumb(
      Graphics g, JComponent c, Rectangle thumbBounds) {
    super.paintThumb(g, c, thumbBounds);
    Graphics2D g2 = (Graphics2D) g.create();
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);
    Color oc = null;
    Color ic = null;
    JScrollBar sb = (JScrollBar) c;
    if (!sb.isEnabled() || thumbBounds.width > thumbBounds.height) {
      return;
    } else if (isDragging) {
      oc = SystemColor.activeCaption.darker();
      ic = SystemColor.inactiveCaptionText.darker();
    } else if (isThumbRollover()) {
      oc = SystemColor.activeCaption.brighter();
      ic = SystemColor.inactiveCaptionText.brighter();
    } else {
      oc = SystemColor.activeCaption;
      ic = SystemColor.inactiveCaptionText;
    }
    paintCircle(g2, thumbBounds, 6, oc);
    paintCircle(g2, thumbBounds, 10, ic);
    g2.dispose();
  }

  private void paintCircle(Graphics2D g2, Rectangle b, int w, Color c) {
    g2.setPaint(c);
    int ww = b.width - w;
    g2.fillOval(b.x + w / 2, b.y + (b.height - ww) / 2, ww, ww);
  }
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、WindowsScrollBarUIを取得して垂直スクロールバーに円形アイコンを表示しています。

  • WindowsLookAndFeelが使用されている場合以下の状態の変化に応じてアイコンの色を変更
    • 通常の状態
    • マウスでドラッグ中
    • ロールオーバー中
  • スクロールバーの長さが足りない場合このアイコンは表示しない

参考リンク

コメント