JComponentには背景画像を表示する標準機能がない。
JComponentの派生クラスを作り、paintComponentをオーバライドし、自力でイメージを描画する必要がありそうだ。
いちいち派生クラスを作らないで、部品化することはできないかと、ほんのちょっとだけ思案してみたが、有力なジェネリックスも動的でないため、できそうにない。
しかたなくヘルパークラスにしてみた。
以下がその背景画像付きJComponentのヘルパーだ。
import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Image; import javax.swing.ImageIcon; import javax.swing.JComponent; public class ImageBackgroundComponent { public static final int STRETCH = 0; public static final int TILED = 1; public static final int ACTUAL = 2; private Image _img; private int _style = ACTUAL; private Color _bgcolor = null; private float _halign = Component.CENTER_ALIGNMENT; private float _valign = Component.CENTER_ALIGNMENT; public ImageBackgroundComponent(Image img, int style) { this._img = img; this._style = style; } public ImageBackgroundComponent(Image img, int style, float halign, float valign, Color bgcolor) { this._img = img; this._style = style; this._halign = halign; this._valign = valign; this._bgcolor = bgcolor; } public void paintComponent(Graphics g, JComponent parent) { if(this._img != null) { int fw = parent.getWidth(); int fh = parent.getHeight(); if(this._bgcolor != null) { g.setColor(this._bgcolor); g.fillRect(0, 0, fw, fh); } ImageIcon icon = new ImageIcon(this._img); if(icon != null) { int iw = icon.getIconWidth(); int ih = icon.getIconHeight(); if(this._style == TILED) { for(int y = 0; y < fh; y += ih) { for(int x = 0; x < fw; x += iw) { g.drawImage(icon.getImage(), x, y, iw, ih, parent); } } } else { int w = (this._style == STRETCH)? fw: iw; int h = (this._style == STRETCH)? fh: ih; int x = (int)Math.floor(fw * this._halign) - w / 2; int y = (int)Math.floor(fh * this._valign) - h / 2; g.drawImage(icon.getImage(), x, y, w, h, parent); } } } } }
使い方は以下。
残念ながら派生が必要だ。
public class ImageDesktopPane extends JDesktopPane { static final long serialVersionUID = 0L; private ImageBackgroundComponent imbcomp; public ImageDesktopPane(Image img) { this.imbcomp = new ImageBackgroundComponent(img, ImageBackgroundComponent.ACTUAL); // When using a tile pattern //this.imbcomp = new ImageBackgroundComponent(img, // ImageBackgroundComponent.TILED); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); this.imbcomp.paintComponent(g, this); } }