📄 sweepminebuttoneventlistener.java
字号:
/*
* @(#)SweepMineButtonEventListener.java 1.0 03/08/22
* Copyright 2003 Entao Zhang, All rights reserved.
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/**
* 扫雷的事件处理类.
*/
public class SweepMineButtonEventListener extends
ComponentsEventListener implements MouseListener,ActionListener{
private Timer doneDelay=new Timer(200,this);
private int loc,swap;
//bothButton标识双键按下而未释放时时间段.
private boolean bothButton=false;
private SweepMineButtonManager cm;
public SweepMineButtonEventListener(ImageRevertUnitPane ir,
SweepMineButtonManager cm){
super(ir);
this.cm=cm;
}
public void addListener(Component c){
c.addMouseListener(this);
}
/**
* 如果处于bothButton状态,则判断是否左键被释放掉,如已被释放掉,则取消
* bothButton状态,并把进入bothButton状态时按下的grids复原.
*
* 如果释放的仅是左键并不处于bothButton状态,并且未播开并未标记则调用
* 播开处理方法.
*/
public void mouseReleased(MouseEvent e){
if (ir.isConfused()){
JButton source=(JButton)e.getSource();
loc=Integer.parseInt(source.getName());
if (bothButton){
if ((e.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) !=
InputEvent.BUTTON1_DOWN_MASK){
boolean around[]=cm.checkAround(loc);
if (cm.button[loc].getText()==cm.str[0] &&
ir.grids[loc]!=cm.OPENED)
cm.componentStateChange(loc,true);
for (int i=0; i<around.length; i++){
if(around[i]){
swap=loc+cm.aroundOffset[i];
if (cm.button[swap].getText()==cm.str[0] &&
ir.grids[swap]!=cm.OPENED)
cm.componentStateChange(swap,true);
}
}
bothButton=false;
}
}else if (e.getButton()==MouseEvent.BUTTON1){
if(ir.grids[loc]!=cm.OPENED && source.getText()!=cm.strFlag){
cm.chainOpen(loc);
if (cm.sum+cm.num==ir.gridLength) {
doneDelay.start();
}
}
}
}
}
/**
* 鼠标同时按下左右键或中键则把周围没有播开并没有标记为雷的grids按下.
* 如果点的是被播开的grids并且其数字和周围已标记为雷的grids数量相等,
* 则把周围未播开的都播开,否则标记bothButton等待释放.
*
* 如果按下的只是右键,并未播开则调用mainPane管理类的标记方法.
*/
public void mousePressed(MouseEvent e){
if (ir.isConfused()){
loc=Integer.parseInt(((JButton)e.getSource()).getName());
if ((e.getModifiersEx() & (InputEvent.BUTTON1_DOWN_MASK |
InputEvent.BUTTON3_DOWN_MASK))==(InputEvent.BUTTON1_DOWN_MASK
| InputEvent.BUTTON3_DOWN_MASK)
||e.getButton()==MouseEvent.BUTTON2){
String locText=cm.button[loc].getText();
boolean opened=ir.grids[loc]==cm.OPENED && locText!=cm.str[0];
boolean around[]=cm.checkAround(loc);
int flagSum=0;
if(ir.grids[loc]!=cm.OPENED && locText!=cm.strFlag)
cm.componentStateChange(loc,false);
for (int i=0; i<around.length; i++){
if(around[i]){
swap=loc+cm.aroundOffset[i];
if(opened){
if (cm.button[swap].getText()==cm.strFlag) flagSum++;
}
if(ir.grids[swap]!=cm.OPENED && cm.button[swap].getText()
!=cm.strFlag)
cm.componentStateChange(swap,false);
}
}
if (String.valueOf(flagSum).equals(locText)){
for (int i=0; i<around.length; i++){
if(around[i]){
swap=loc+cm.aroundOffset[i];
if (ir.grids[swap]!=cm.OPENED &&
cm.button[swap].getText()
!=cm.strFlag) cm.chainOpen(swap);
}
}
if (cm.sum+cm.num==ir.gridLength) {
doneDelay.start();
}
}else bothButton=true;
}else if (e.getButton()==MouseEvent.BUTTON3){
if(ir.grids[loc]!=cm.OPENED){
cm.markButton(loc);
}
}
}
}
public void mouseExited(MouseEvent e){
};
public void mouseEntered(MouseEvent e){
};
public void mouseClicked(MouseEvent e){
};
//处理完成并结束过程.把所有未标记grids标记出来.
public void actionPerformed(ActionEvent e){
doneDelay.stop();
cm.timer.stop();
for (int i=0; i<ir.gridLength; i++){
if(ir.grids[i]==cm.MINE && cm.button[i].getText()!=cm.strFlag){
cm.button[i].setForeground(cm.strFlagColor);
cm.button[i].setText(cm.strFlag);
}
}
ir.done();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -