• category: swing folder: IndeterminateAnimation title: JProgressBarの不確定モードアニメーションを一方向に変更する tags: [JProgressBar, Animation, LookAndFeel] author: aterai pubdate: 2018-12-31T17:42:54+09:00 description: MetalLookAndFeelを適用したJProgressBarの不確定モードアニメーションを跳ね返りではなく左から右への一方向繰り返しに変更します。 image: https://drive.google.com/uc?id=18dq3XCJzHrT69mJQQafMAz808GvXj2vTPQ

概要

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)を設定しても不確定モードのアニメーションは右から左へには変化しない

参考リンク

コメント