概要

MetalLookAndFeelを適用したJProgressBarの不確定モードアニメーションを跳ね返りではなく左から右への一方向繰り返しに変更します。

サンプルコード

class OneDirectionIndeterminateProgressBarUI extends BasicProgressBarUI {
  // @see com/sun/java/swing/plaf/windows/WindowsProgressBarUI.java
  @Override protected Rectangle getBox(Rectangle r) {
    Rectangle rect = super.getBox(r);
    int framecount = getFrameCount() / 2;
    int currentFrame = getAnimationIndex() % framecount;

    if (progressBar.getOrientation() == JProgressBar.VERTICAL) {
      int len = progressBar.getHeight();
      len += rect.height * 2; // add 2x for the trails
      double delta = len / (double) framecount;
      rect.y = (int) (delta * currentFrame);
    } else {
      int len = progressBar.getWidth();
      len += rect.width * 2; // add 2x for the trails
      double delta = len / (double) framecount;
      rect.x = (int) (delta * currentFrame);
    }
    return rect;
  }
}
View in GitHub: Java, Kotlin

解説

  • 上: デフォルト
    • BasicLookAndFeelMetalLookAndFeelの不確定モードは矩形が左右に往復するアニメーションがデフォルト
  • 下: Windows
    • Windows環境での不確定モードは矩形が左から右への一方向を繰り返すアニメーションがデフォルト
    • WindowsProgressBarUIgetBox(...)メソッドを参考にBasicProgressBarUI#getBox(...)メソッドをオーバーライド
      • フレーム数を半分にして「行き」分だけアニメーションを表示する
    • 元のWindowsProgressBarUIJProgressBar#setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT)を設定しても不確定モードのアニメーションは右から左へには変化しない

参考リンク

コメント