Swing/BlurButton のバックアップの現在との差分(No.7)
- category: swing folder: BlurButton title: ConvolveOpでコンポーネントにぼかしを入れる tags: [JButton, ConvolveOp, BufferedImage] author: aterai pubdate: 2013-12-09T00:54:27+09:00 description: ConvolveOpを使って、使用不可状態のJButtonにぼかしを入れます。 image:
概要
概要
ConvolveOp
を使って、使用不可状態のJButton
にぼかしを入れます。
Screenshot
Advertisement
サンプルコード
サンプルコード
class BlurButton extends JButton {
private final ConvolveOp op = new ConvolveOp(
new Kernel(3, 3, new float[] {
.05f, .05f, .05f,
.05f, .60f, .05f,
.05f, .05f, .05f
}), ConvolveOp.EDGE_NO_OP, null);
private int iw = -1;
private int ih = -1;
private BufferedImage buf;
#spanadd
#spanend
public BlurButton(String label) {
super(label);
//System.out.println(op.getEdgeCondition());
// System.out.println(op.getEdgeCondition());
}
#spanadd
#spanend
@Override protected void paintComponent(Graphics g) {
if (isEnabled()) {
super.paintComponent(g);
} else {
if (buf == null || iw != getWidth() || ih != getHeight()) {
iw = getWidth();
ih = getHeight();
buf = new BufferedImage(iw, ih, BufferedImage.TYPE_INT_ARGB);
}
int w = getWidth();
int h = getHeight();
buf = Optional.ofNullable(buf)
.filter(bi -> bi.getWidth() == w && bi.getHeight() == h)
.orElseGet(() -> new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB));
Graphics2D g2 = buf.createGraphics();
g2.setFont(g.getFont()); // pointed out by 八ツ玉舘
super.paintComponent(g2);
g2.dispose();
g.drawImage(op.filter(buf, null), 0, 0, null);
}
}
@Override public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
d.width += 3 * 3;
return d;
}
#spanadd
#spanend
// @Override public Dimension getPreferredSize() {
// Dimension d = super.getPreferredSize();
// d.width += 3 * 3;
// return d;
// }
}
View in GitHub: Java, Kotlin解説
解説
- 上
- デフォルトの
JButton
- デフォルトの
- 中
ConvolveOp
を使って、使用不可状態のJButton
にぼかし- Java Swing Hacks 9. 使用不可状態のコンポーネントをぼかし表示するから引用
- Java Swing Hacks 9. 使用不可状態のコンポーネントをぼかし表示するから引用
- 下
-
WindowsLookAndFeel
の場合、右端1
ドットの表示が乱れる場合があるので、EdgeCondition
をデフォルトのEDGE_ZERO_FILL
から、EDGE_NO_OP
に変更 -
WindowsLookAndFeel
の場合、これらのぼかしを入れると文字が拡大されて?(左右のBorder
が広いから?)、文字列が省略されてしまうので、JButton#getPreferredSize()
をオーバーライドして幅を拡大 -
WindowsLookAndFeel
の場合、右端1
ドットの表示が乱れる場合があるのでEdgeCondition
をデフォルトのEDGE_ZERO_FILL
からEDGE_NO_OP
に変更 -
WindowsLookAndFeel
の場合、これらのぼかしを入れると文字が拡大されて?(左右のBorder
が広いから?)文字列が省略されてしまうのでJButton#getPreferredSize()
をオーバーライドして幅を拡大- コメントで八ツ玉舘さんから指摘があり、文字が拡大されるのは
BufferedImage
から生成したGraphics
とコンポーネントのGraphics
で異なるフォントが設定されていることが原因と判明 -
g2.setFont(g.getFont());
を使用するよう修正
- コメントで八ツ玉舘さんから指摘があり、文字が拡大されるのは
-
参考リンク
参考リンク
- ConvolveOp (Java Platform SE 8)
- 5.8.1 イメージ処理操作の使用方法
- Java Image Processing - Blurring for Beginners
- Java Swing Hacks 9. 使用不可状態のコンポーネントをぼかし表示する
- Java Swing Hacks 9. 使用不可状態のコンポーネントをぼかし表示する