Swing/ColorChannelSwapFilter のバックアップ(No.9)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ColorChannelSwapFilter へ行く。
- 1 (2013-06-25 (火) 20:51:09)
- 2 (2014-08-25 (月) 00:00:22)
- 3 (2014-08-25 (月) 21:54:40)
- 4 (2014-11-11 (火) 02:56:59)
- 5 (2014-11-22 (土) 04:01:39)
- 6 (2016-01-05 (火) 15:48:36)
- 7 (2016-11-18 (金) 15:00:41)
- 8 (2017-11-25 (土) 17:37:47)
- 9 (2018-02-24 (土) 19:51:30)
- 10 (2018-12-19 (水) 20:38:35)
- 11 (2020-11-17 (火) 12:47:30)
- 12 (2022-12-16 (金) 13:56:58)
- category: swing
folder: ColorChannelSwapFilter
title: JLayerを使ってJProgressBarの色相を変更する
tags: [JProgressBar, JLayer, RGBImageFilter, SwingWorker]
author: aterai
pubdate: 2013-06-24T08:32:54+09:00
description: JLayerを使ってJProgressBarの色相を緑から赤に変更します。
image:
hreflang:
href: http://java-swing-tips.blogspot.com/2013/06/turn-jprogressbar-red-with-jlayer-and.html lang: en
概要
JLayer
を使ってJProgressBar
の色相を緑から赤に変更します。
Screenshot
Advertisement
サンプルコード
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 in GitHub: Java, Kotlin解説
setStringPainted(true)
: 上- デフォルトの
JProgressBar
に、JProgressBar#setStringPainted(true)
を設定
- デフォルトの
setStringPainted(true)
: 下JProgressBar#setStringPainted(true)
を設定- チェックボックスが選択された場合、
JProgressBar#setForeground(Color)
で色を変更
setStringPainted(false)
: 上- デフォルトの
JProgressBar
- デフォルトの
setStringPainted(false)
: 下- チェックボックスが選択された場合、
JLayer
を使って色を変更Windows 7
での中断状態風に、緑を赤に入れ替えるため、RGBImageFilter#filterRGB(...)
をオーバーライド
- チェックボックスが選択された場合、