概要

JLayerを使ってJProgressBarの色相を緑から赤に変更します。

サンプルコード

class BlockedColorLayerUI extends LayerUI<JProgressBar> {
  public boolean isPreventing;
  private transient BufferedImage bi;
  private int prevw = -1;
  private int prevh = -1;

  @Override public void paint(Graphics g, JComponent c) {
    if (isPreventing && c instanceof JLayer) {
      JLayer jlayer = (JLayer) c;
      JProgressBar progress = (JProgressBar) jlayer.getView();
      int w = progress.getSize().width;
      int h = progress.getSize().height;

      if (bi == null || w != prevw || h != prevh) {
        bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
      }
      prevw = w;
      prevh = h;

      Graphics2D g2 = bi.createGraphics();
      super.paint(g2, c);
      g2.dispose();

      Image image = c.createImage(
        new FilteredImageSource(bi.getSource(), new RedGreenChannelSwapFilter()));
      //BUG: cause an infinite repaint loop: g.drawImage(image, 0, 0, c);
      g.drawImage(image, 0, 0, null);
    } else {
      super.paint(g, c);
    }
  }
}

class RedGreenChannelSwapFilter extends RGBImageFilter {
  @Override public int filterRGB(int x, int y, int argb) {
    int r = (int) ((argb >> 16) & 0xff);
    int g = (int) ((argb >>  8) & 0xff);
    int b = (int) ((argb)       & 0xff);
    return (argb & 0xff000000) | (g << 16) | (r << 8) | (b);
  }
}
view all

解説

  • setStringPainted(true): 上
    • デフォルト色のJProgressBarに、JProgressBar#setStringPainted(true)を設定
  • setStringPainted(true): 下
    • JProgressBar#setStringPainted(true)を設定
    • チェックボックスが選択された場合、JProgressBar#setForeground(Color)で色を変更
  • setStringPainted(false): 上
    • デフォルトのJProgressBar
  • setStringPainted(false): 下
    • チェックボックスが選択された場合、JLayerを使って色を変更
      • Windows 7での中断状態風に、緑を赤に入れ替えるため、RGBImageFilter#filterRGB(...)をオーバーライド

参考リンク

コメント

  • NimbusLookAndFeelの場合、JProgressBar#setOpaque(true)としてJLayerRedGreenChannelSwapFilterを使用しないと、フチが半透明にならない。またNimbusLookAndFeelの場合、JProgressBar#setForeground(Color)で変化するのは他のLookAndFeelとは異なり、進捗文字列になる。 -- aterai
  • 再描画が無限ループするバグを修正。 -- aterai