实现功能: 类似于windows xp中的快速按钮的风格, 允许指定按钮的状态是自弹起(就是鼠标键按下时按钮产生被按下的效果, 鼠标键抬起的时候按钮自动回复原状)着是开关按钮(点击一次, 按钮被按下, 再点击一次, 按钮被弹起), 并能够设定一组(多个)或多组互斥按钮(即同组中有且只有一个按钮一直处于被按下的状态). 当然, 这个类不是很完善, 有许多地方可以改进, 比如没有加入当按钮处于禁止使用的状态(disabled), 应该再引入一个image来显示成灰色的效果等. 您就自己改改吧. :)
程序代码:
speedbutton.java
--------------------------------
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class speedbutton extends jbutton implements mouselistener {
private boolean entered = false; /* 标志, 用于判断鼠标是否在按钮上 */
private boolean downed = false; /* 标志, 用于按钮是否被按下 */
private boolean enableddowned = false; /* 标志, 用于按钮是否允许被按下 */
private image image = null;
private int groupid = 0; /* 指定按钮属于哪个互斥组, 取值为0时不判断 */
private int buttonid; /* 按钮本身的id号, 唯一 */
/**
* 这个构造器有点烦, 这里可以进行优化成多个构造器来组合.
* @see com.javax.swing.jbutton
* @author delfan,2002.07.23
* @version 1.0
*/
public speedbutton(int buttonid, image image, int width, int height, string tip, boolean enableddowned,boolean initmode, int groupid, actionlistener actionlistener) {
this.buttonid = buttonid;
this.image = image;
addmouselistener(this);
setpreferredsize(new dimension(width, height));
settooltiptext(tip);
this.enableddowned = enableddowned;
this.groupid = groupid;
downed = initmode;
addactionlistener(actionlistener);
}
public void paint(graphics g) {
if (getsize().height == 2 || getsize().width == 2) { // 画分隔条, 当按钮宽度或高度为2的时候,
g.setcolor(new color(119, 133, 168)); // 认为是分隔条
g.fillrect(0, 0, getwidth() - 1, getheight() - 1);
g.setcolor(new color(129, 143, 178));
g.fillrect(1, 1, getwidth(), getheight());
setenabled(false);
}
else
{
if (entered) { // 鼠标在按钮内
g.setcolor(new color(119, 133, 168));
g.fillrect(0, 0, getwidth(), getheight());
g.setcolor(new color(8, 36, 107));
g.drawrect(0, 0, getwidth() - 1, getheight() - 1);
if (image != null) g.drawimage(image, 2, 2, getparent());
} else { // 鼠标不在按钮内
g.setcolor(getparent().getbackground());
g.fillrect(0, 0, getwidth(), getheight());
if (image != null) g.drawimage(image, 2, 2, getparent());
}
if (downed) { // 按钮被按下
g.setcolor(new color(181, 190, 214));
g.fillrect(0, 0, getwidth(), getheight());
g.setcolor(new color(8, 36, 107));
g.drawrect(0, 0, getwidth() - 1, getheight() - 1);
if (image != null) g.drawimage(image, 3, 3, getparent());
}
}
}
public void update(graphics g) {paint(g);}
/**
* 按钮是否处于按下状态
*/
public boolean isdowned() {return downed;}
/**
* 取得按钮的组索引号
*/
public int getgroupid() {return groupid;}
public void setdowned(boolean downed) {this.downed = downed;repaint();}
public void mouseentered(mouseevent e) {entered = true;repaint();}
public void mouseexited(mouseevent e) {entered = false;repaint();}
public void mouseclicked(mouseevent e) {}
public void mousepressed(mouseevent e) {
if (enableddowned && downed && groupid == 0)
downed = false;
else
downed = true;
repaint();
}
public void mousereleased(mouseevent e) {
if (!enableddowned) downed = false;
repaint();
if (groupid != 0) // 通过存放按钮的容器进行互斥按钮的状态改变操作
for (int i = 0; i < getparent().getcomponentcount(); i++)
if (getparent().getcomponent(i) instanceof speedbutton) {
if (((speedbutton) getparent().getcomponent(i)).getgroupid() == groupid
&& ((speedbutton) getparent().getcomponent(i)) != this)
((speedbutton) getparent().getcomponent(i)).setdowned(false);
}
}
public int getbuttonid() {return buttonid;}
}
闽公网安备 35060202000074号