• category: swing folder: IndeterminateRegionPainter title: JProgressBarのNimbusLookAndFeelにおける不確定状態アニメーションを変更する tags: [JProgressBar, UIDefaults, Painter, NimbusLookAndFeel, Animation] author: aterai pubdate: 2014-06-30T15:57:20+09:00 description: JProgressBarをNimbusLookAndFeelで使用している場合、その不確定状態アニメーションを変更します。 image: https://lh5.googleusercontent.com/-L28C52EISs4/U7AofjsiWqI/AAAAAAAACIo/OHDDAqKKk6E/s800/IndeterminateRegionPainter.png

概要

JProgressBarNimbusLookAndFeelで使用している場合、その不確定状態アニメーションを変更します。

サンプルコード

UIDefaults d = new UIDefaults();
#spandel
d.put("ProgressBar[Enabled+Indeterminate].foregroundPainter", new AbstractRegionPainter() {
#spanend
  //...
#spanadd
d.put("ProgressBar[Enabled+Indeterminate].foregroundPainter",
#spanend
      new AbstractRegionPainter() {
  // ...
  private final PaintContext ctx = new PaintContext(
      new Insets(5, 5, 5, 5), new Dimension(29, 19), false);
  @Override public void doPaint(
      Graphics2D g, JComponent c, int width, int height, Object[] extendedCacheKeys) {
        Graphics2D g, JComponent c, int width, int height,
        Object[] extendedCacheKeys) {
    path = decodePath1();
    g.setPaint(color17);
    g.fill(path);
    rect = decodeRect3();
    g.setPaint(decodeGradient5(rect));
    g.fill(rect);
    rect = decodeRect4();
    g.setPaint(decodeGradient6(rect));
    g.fill(rect);
  }
#spanadd

#spanend
  @Override public PaintContext getPaintContext() {
    return ctx;
  }
  //...
  // ...
});
#spandel
progressBar1 = new JProgressBar(model);
#spanend
#spandel
progressBar1.putClientProperty("Nimbus.Overrides", d);
#spanend
#spanadd
progress = new JProgressBar(model);
#spanend
#spanadd
progress.putClientProperty("Nimbus.Overrides", d);
#spanend
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、NimbusLookAndFeelJProgressBarの不確定状態を表現するアニメーションを変更するために、セルの描画を行うAbstractRegionPainter#doPaint(...)をオーバーライドしたPainterを作成し、これをUIDefaultsに設定しています。

  • AbstractRegionPainter#doPaint(...)の中身はProgressBarPainter#paintForegroundEnabled(...)と同等だが、このメソッドや関連するProgressBarPainter#decodePath1()などのメソッドはprotectedではなくすべてprivateのためペインターごとコピーすることで対応

参考リンク

コメント