package com.jinghouyu.sl;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JButton;
public abstract class AbstractLabel extends JButton {
private static final long serialVersionUID = -8481214576261126230L;
public final static String EXP_PATH = "bin/images/exp.jpg";
public final static String FLAG_PATH = "bin/images/flag.jpg";
public final static String CLOSED_PATH = "bin/images/normal.jpg";
public static final String NULL_PATH = "bin/images/null.jpg";
public final static String MOUSE_ON = "bin/images/on.jpg";
public final static String MOUSE_DOWN = "bin/images/down.jpg";
private String photo = CLOSED_PATH;
public void setPhoto(String photo) {
this.photo = photo;
}
//元素的状态
public final static int MINE_OPENED = 1;
public final static int MINE_CLOSED = 2;
public final static int MINE_FLAG = 3;
public final static int MINE_EXP = 4;
private Position position = null;
private int state = MINE_CLOSED; //打开或关闭
private int rightMouseState = MINE_CLOSED; //点击右键时的状态
public Position getPosition() {
return position;
}
public void setPosition(Position position) {
this.position = position;
}
private LandMinePanel parent = null;
public LandMinePanel getMineParent() {
return parent;
}
public void setMineParent(LandMinePanel parent) {
this.parent = parent;
}
public void setState(int state) {
this.state = state;
if(state == MINE_CLOSED) {
this.rightMouseState = MINE_CLOSED;
}
}
protected int getState() {
return state;
}
public AbstractLabel() {
this.addMouseListener(new MineLabelMouseListener(this));
}
public void paintComponent(final Graphics g) {
super.paintComponent(g);
paintPhoto(g);
paintState(g);
}
private void paintPhoto(Graphics g) {
g.drawImage(new ImageIcon(this.photo).getImage(),0,0,this.getWidth(),this.getHeight(),null);
}
private void paintState(Graphics g) {
if(isOpened()) {
this.paintOpened(g);
}
}
protected boolean isOpened() {
return state == MINE_OPENED;
}
public boolean isNormalRightState() {
return rightMouseState == MINE_CLOSED;
}
public void mouseRightClicked() {
if(isOpened()) {
return;
}
switch(rightMouseState) {
case MINE_CLOSED : {
this.setRightMouseState(MINE_FLAG);
int count = this.getMineParent().getLabelCount();
this.getMineParent().setLabelCount(--count);
}; break;
case MINE_FLAG : {
this.setRightMouseState(MINE_EXP);
int count = this.getMineParent().getLabelCount();
this.getMineParent().setLabelCount(++count);
}break;
case MINE_EXP : this.setRightMouseState(MINE_CLOSED); break;
}
this.paintComponent(this.getGraphics());
}
public int getRightMouseState() {
return rightMouseState;
}
public void setRightMouseState(int rightMouseState) {
this.rightMouseState = rightMouseState;
switch(rightMouseState) {
case MINE_CLOSED : this.setPhoto(CLOSED_PATH); break;
case MINE_FLAG : this.setPhoto(FLAG_PATH); break;
case MINE_EXP : this.setPhoto(EXP_PATH); break;
}
}
public LandMinePanel getLabelParent() {
return parent;
}
public void setLabelParent(LandMinePanel parent) {
this.parent = parent;
}
public List<AbstractLabel> getSurroundClosedLabels() {
List<AbstractLabel> list = new ArrayList<AbstractLabel>();
for(AbstractLabel label : getSurroundMineLabels()) {
if(!label.isOpened() && label.isNormalRightState()) {
list.add(label);
}
}
return list;
}
public List<AbstractLabel> getSurroundFlagedMineLabels() {
List<AbstractLabel> list = new ArrayList<AbstractLabel>();
for(AbstractLabel label : getSurroundMineLabels()) {
if(label.getRightMouseState() == MINE_FLAG) {
list.add(label);
}
}
return list;
}
public List<AbstractLabel> getSurroundMineLabels() {
int x = this.getPosition().getX();
int y = this.getPosition().getY();
LandMinePanel parent = this.getMineParent();
AbstractLabel label1 = parent.getMineLabelAt(x - 1, y - 1);
AbstractLabel label2 = parent.getMineLabelAt(x - 1, y);
AbstractLabel label3 = parent.getMineLabelAt(x - 1,y + 1);
AbstractLabel label4 = parent.getMineLabelAt(x, y - 1);
AbstractLabel label5 = parent.getMineLabelAt(x, y + 1);
AbstractLabel label6 = parent.getMineLabelAt(x + 1, y - 1);
AbstractLabel label7 = parent.getMineLabelAt(x + 1, y);
AbstractLabel label8 = parent.getMineLabelAt(x + 1, y + 1);
List<AbstractLabel> list = new ArrayList<AbstractLabel>();
if(label1 != null) list.add(label1);
if(label2 != null) list.add(label2);
if(label3 != null) list.add(label3);
if(label4 != null) list.add(label4);
if(label5 != null) list.add(label5);
if(label6 != null) list.add(label6);
if(label7 != null) list.add(label7);
if(label8 != null) list.add(label8);
return list;
}
protected abstract void open();
protected boolean hasMineInList(List<AbstractLabel> list) {
for(AbstractLabel label : list) {
if(label.isMine()) {
return true;
}
}
return false;
}
protected static void labelListPhoto(final List<AbstractLabel> list,final String photo) {
for(AbstractLabel label : list) {
if(label.isOpened() || !label.isNormalRightState()) {
continue;
}
label.setPhoto(photo);
label.paintComponent(label.getGraphics());
}
}
protected void mouseLeftClicked(List<AbstractLabel> list) {
for(AbstractLabel label : list) {
label.mouseLeftClicked();
}
}
public void dbClicked() {
if(!this.isNormalRightState() || !this.isOpened()) return;
labelListPhoto(this.getSurroundClosedLabels(),MOUSE_DOWN);
}
public void dbReleased() {
//由TextLabel实现该效果,其他没有此效果
}
protected abstract boolean isMine();
protected abstract void paintOpened(Graphics g);
protected abstract void mouseLeftClicked();
}
Java 扫雷源码J2SE
5星 · 超过95%的资源 需积分: 9 55 浏览量
2011-04-03
20:51:58
上传
评论 1
收藏 1.41MB RAR 举报
liujingyu3344
- 粉丝: 0
- 资源: 1
- 1
- 2
前往页