Swing/RoundButton のバックアップの現在との差分(No.1)
TITLE:JButtonの形を変更
JButtonの形を変更
編集者:Terai Atsuhiro~
作成日:2007-07-02
更新日:2021-06-04 (金) 11:33:39
概要
円形やラウンド矩形などの任意の図形を適用したJButton
を作成します。
Screenshot
Advertisement
概要
円形や角丸のJButtonを作成します。#screenshot
サンプルコード
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
class RoundedCornerButton extends JButton {
private static final float arcwidth = 16.0f;
private static final float archeight = 16.0f;
protected static final int focusstroke = 2;
protected final Color fc = new Color(100,150,255,200);
protected final Color ac = new Color(230,230,230);
private static final float ARC_WIDTH = 16f;
private static final float ARC_HEIGHT = 16f;
protected static final int FOCUS_STROKE = 2;
protected final Color fc = new Color(100, 150, 255, 200);
protected final Color ac = new Color(230, 230, 230);
protected final Color rc = Color.ORANGE;
protected Shape shape;
protected Shape border;
protected Shape base;
public RoundedCornerButton() {
super();
}
#spanadd
#spanend
public RoundedCornerButton(Icon icon) {
super(icon);
}
#spanadd
#spanend
public RoundedCornerButton(String text) {
super(text);
//setRolloverEnabled(true);
}
#spanadd
#spanend
public RoundedCornerButton(Action a) {
super(a);
// setAction(a);
}
#spanadd
#spanend
public RoundedCornerButton(String text, Icon icon) {
super(text, icon);
// setModel(new DefaultButtonModel());
// init(text, icon);
// setContentAreaFilled(false);
// setBackground(new Color(250, 250, 250));
// initShape();
}
#spanadd
#spanend
@Override public void updateUI() {
super.updateUI();
setContentAreaFilled(false);
setFocusPainted(false);
setBackground(new Color(250, 250, 250));
initShape();
}
#spanadd
#spanend
protected void initShape() {
if(!getBounds().equals(base)) {
if (!getBounds().equals(base)) {
base = getBounds();
shape = new RoundRectangle2D.Float(0, 0,
getWidth()-1, getHeight()-1,
arcwidth, archeight);
border = new RoundRectangle2D.Float(focusstroke, focusstroke,
getWidth()-1-focusstroke*2,
getHeight()-1-focusstroke*2,
arcwidth, archeight);
shape = new RoundRectangle2D.Float(
0, 0, getWidth() - 1, getHeight() - 1, ARC_WIDTH, ARC_HEIGHT);
border = new RoundRectangle2D.Float(
FOCUS_STROKE, FOCUS_STROKE, getWidth() - 1 - FOCUS_STROKE * 2,
getHeight() - 1 - FOCUS_STROKE * 2, ARC_WIDTH, ARC_HEIGHT);
}
}
protected void paintComponent(Graphics g) {
#spanadd
#spanend
private void paintFocusAndRollover(Graphics2D g2, Color color) {
g2.setPaint(new GradientPaint(
0, 0, color, getWidth() - 1, getHeight() - 1,
color.brighter(), true));
g2.fill(shape);
g2.setColor(getBackground());
g2.fill(border);
}
#spanadd
#spanend
@Override protected void paintComponent(Graphics g) {
initShape();
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
if(getModel().isArmed()) {
Graphics2D g2 = (Graphics2D) g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
if (getModel().isArmed()) {
g2.setColor(ac);
g2.fill(shape);
}else if(isRolloverEnabled() && getModel().isRollover()) {
} else if (isRolloverEnabled() && getModel().isRollover()) {
paintFocusAndRollover(g2, rc);
}else if(hasFocus()) {
} else if (hasFocus()) {
paintFocusAndRollover(g2, fc);
}else{
} else {
g2.setColor(getBackground());
g2.fill(shape);
}
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_OFF);
g2.setColor(getBackground());
super.paintComponent(g2);
g2.dispose();
}
private void paintFocusAndRollover(Graphics2D g2, Color color) {
g2.setPaint(new GradientPaint(0, 0, color,
getWidth()-1, getHeight()-1, color.brighter(), true));
g2.fill(shape);
g2.setColor(getBackground());
g2.fill(border);
}
protected void paintBorder(Graphics g) {
#spanadd
#spanend
@Override protected void paintBorder(Graphics g) {
initShape();
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
Graphics2D g2 = (Graphics2D) g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(getForeground());
g2.draw(shape);
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
g2.dispose();
}
protected boolean contains(int x, int y) {
#spanadd
#spanend
@Override public boolean contains(int x, int y) {
initShape();
return shape.contains(x, y);
return shape == null ? false : shape.contains(x, y);
}
}
- &jnlp;
- &jar;
- &zip;
解説
上記のサンプルでは、JButton#paintComponent()をオーバーライドすることで描画を、Jbutton#contains()をオーバーライドすることでクリック可能な範囲を変更しています。解説
- 形や縁、クリック可能な領域をラウンド矩形などの
Shape
に変更したボタンを作成-
JButton#paintComponent()
メソッドをオーバーライドして描画を変更 -
JButton#contains()
メソッドをオーバーライドしてマウスでクリック可能な領域を変更
-
- 角丸ボタンを継承して円ボタンを作成
- 幅と高さが同じになるように
getPreferredSize()
メソッドをオーバーライド - 図形の初期化メソッドをオーバーライド
- メソッド名前は適当、上記のサンプルでは
initShape()
- メソッド名前は適当、上記のサンプルでは
- 幅と高さが同じになるように
- PreferredSize(高さを幅と同じに)を設定
- 図形の初期化メソッド*1をオーバーライド
class RoundButton extends RoundedCornerButton {
public RoundButton(String text) {
super(text);
setFocusPainted(false);
Dimension size = getPreferredSize();
size.width = size.height = Math.max(size.width, size.height);
setPreferredSize(size);
initShape();
}
#spanadd
#spanend
@Override public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
d.width = d.height = Math.max(d.width, d.height);
return d;
}
#spanadd
#spanend
protected void initShape() {
if(!getBounds().equals(base)) {
if (!getBounds().equals(base)) {
base = getBounds();
shape = new Ellipse2D.Float(0, 0, getWidth()-1, getHeight()-1);
shape = new Ellipse2D.Float(0, 0, getWidth() - 1, getHeight() - 1);
border = new Ellipse2D.Float(focusstroke, focusstroke,
getWidth()-1-focusstroke*2,
getHeight()-1-focusstroke*2);
getWidth() - 1 - focusstroke * 2,
getHeight() - 1 - focusstroke * 2);
}
}
}
参考リンク
- CREATING ROUND SWING BUTTONS - JDC Tech Tips: August 26, 1999
- http://java.sun.com/developer/TechTips/txtarchive/1999/Aug99_PatrickC.txt