按钮点击须要让jpanel实现鼠标点击事件。跟随着效果的切换,便可实现按钮的效果。ide
举个例子:this
有一个"购买"按钮,images以下spa
normal: code
mouseOver: orm
disabled: blog
pressed:事件
代码以下:资源
public class ShopButton extends JPanel implements MouseListener { private Shop shopUI; private Image[] img; private Image normalImage; private Image rolloverImage; private Image pressedImage; private Image disabledImage; private Image currentImage; private boolean enabled = true; private String name = null; private Control control; public ShopButton(Shop shopUI,String name, int x, int y,Control control) { this.shopUI = shopUI; this.name = name;//设置名称 this.control = control; this.img = this.shopUI.createCardImg(name);//这里就是使用工厂模式获取img资源 this.normalImage = this.img[0]; this.rolloverImage = this.img[1]; this.pressedImage =this.img[2]; this.disabledImage = this.img[3]; this.currentImage = normalImage; this.setBounds(x, y, this.img[0].getWidth(null), this.img[0].getHeight(null)); this.addMouseListener(this); } public boolean isEnabled() { return enabled; } public void setEnabled(boolean enabled) { this.enabled = enabled; } public void paint(Graphics g) { this.setOpaque(false); // 背景透明 if (enabled){ g.drawImage(currentImage, this.getX(), this.getY(), this.getWidth(), this.getHeight(), this); } else if (!(name.equals("buy") || name.equals("cancel"))){ g.drawImage(disabledImage, this.getX(), this.getY(), this.getWidth(), this.getHeight(), this); } } @Override public void mouseClicked(MouseEvent e) { } @Override public void mousePressed(MouseEvent e) { currentImage = pressedImage; if(enabled){ if (this.name.equals("close")){//退出商店 this.shopUI.moveToBack(); this.control.exitShop(); } else if (this.name.equals("cancel")){//取消当前选择 this.shopUI.setChooseCard(null); } else if (this.name.equals("buy")){//购买当前选择 this.control.buyCard(this.shopUI.getShop()); } else { this.shopUI.setChooseCard(this); } } } @Override public void mouseReleased(MouseEvent e) { currentImage = rolloverImage; } @Override public void mouseEntered(MouseEvent e) { currentImage = rolloverImage; } @Override public void mouseExited(MouseEvent e) { currentImage = normalImage; } }
适当的扩展能够作成通用类,可以模拟各种按钮类。get
如下是 mini大富翁内的商店界面:红框内是扩展实现it