📄 mainframe.java
字号:
package nicholas.game.mine;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import nicholas.awt.LedNumber;
import nicholas.swing.AboutDialog;
public class MainFrame extends JFrame implements ActionListener {
//UI components
private JLabel mineLabel;
private JLabel timeLabel;
private JLabel statusButton;
private JPanel gridPanel;
private JPanel statusPanel;
private Dimension gpd;
private Dimension spd;
private MineGrid grid[][];
private boolean mode[][];
private final int margin = 7;
private final int titleh = 52;
private int xBound;
private int yBound;
private int mineCount;
private int showCount; //the amount of grids opened
private int leftCount; //the amount of mines not labeled
private int timepassed;
private boolean firstClick;
private boolean markCheck;
//Menu Components
private JMenuItem startItem;
private JMenuItem exitItem;
private JMenuItem logItem;
private JMenuItem aboutItem;
private JRadioButtonMenuItem levelItem[];
private JCheckBoxMenuItem markCheckItem;
//Game informations
private LevelInfo levelInfo;
private int currentLevel;
private LevelLog log[];
private LedNumber led;
private GridMouseAdapter gma;
private StatusMouseAdapter sma;
private TimeThread timeThread;
public MainFrame() {
super("扫雷");
//default
currentLevel = 0;
levelInfo = LevelInfo.DEFAULT_LEVEL[currentLevel];
log = new LevelLog[3];
for(int i=0;i<3;i++)
log[i] = new LevelLog();
//read from file
readLog();
led = new LedNumber();
gma = new GridMouseAdapter();
sma = new StatusMouseAdapter();
//setup menus
setMenuBar();
setStatusPanel();
resetPane();
addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
writeLog();
System.exit(0);
}
}
);
setIconImage(ImageFactory.getInstance().getImageicon(16).getImage());
setResizable(false);
}
//execution application
public static void main(String args[]) {
MainFrame application = new MainFrame();
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch(Exception e) {}
}
//file operation
private void readLog() {
try {
File logFile = new File("mine.log");
if(!logFile.exists()) return;
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(logFile));
for(int i=0;i<3;i++) {
log[i] = (LevelLog)ois.readObject();
}
markCheck = ois.readBoolean();
currentLevel = ois.readInt();
if(currentLevel==3) {
levelInfo = (LevelInfo)ois.readObject();
} else {
levelInfo = LevelInfo.DEFAULT_LEVEL[currentLevel];
}
ois.close();
} catch (Exception e) {System.out.println("read fail");}
}
private void writeLog() {
try {
File logFile = new File("mine.log");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(logFile));
for(int i=0;i<3;i++) {
oos.writeObject(log[i]);
}
oos.writeBoolean(markCheck);
oos.writeInt(currentLevel);
if(currentLevel==3) {
oos.writeObject(levelInfo);
}
oos.close();
} catch (Exception e) {System.out.println("write fail");}
}
/*
*add status label to status panel
*/
private void setStatusPanel() {
JPanel temp;
statusPanel = new JPanel(new BorderLayout());
mineLabel = new JLabel();
mineLabel.setBorder(BorderFactory.createLoweredBevelBorder());
temp = new JPanel(new FlowLayout(1,4,4));
temp.add(mineLabel);
temp.setBackground(Color.LIGHT_GRAY);
statusPanel.add(temp,BorderLayout.WEST);
timeLabel = new JLabel();
timeLabel.setBorder(BorderFactory.createLoweredBevelBorder());
temp = new JPanel(new FlowLayout(1,4,4));
temp.add(timeLabel);
temp.setBackground(Color.LIGHT_GRAY);
statusPanel.add(temp,BorderLayout.EAST);
statusButton = new JLabel();
statusButton.setBorder(BorderFactory.createRaisedBevelBorder());
statusButton.addMouseListener(sma);
temp = new JPanel(new FlowLayout(1,0,4));
temp.setBackground(Color.LIGHT_GRAY);
temp.add(statusButton);
statusPanel.add(temp,BorderLayout.CENTER);
statusPanel.setSize(10,37);
statusPanel.setBorder(BorderFactory.createLoweredBevelBorder());
spd = statusPanel.getSize();
}
private void resetStatusPanel() {
mineLabel.setIcon(new ImageIcon(led.getLedImage(leftCount,3)));
timeLabel.setIcon(new ImageIcon(led.getLedImage(timepassed,3)));
statusButton.setIcon(ImageFactory.getInstance().getImageicon(17));
}
private void setGridPanel() {
xBound = levelInfo.getXBound();
yBound = levelInfo.getYBound();
mineCount = levelInfo.getMineCount();
MineGrid.xBound = this.xBound;
MineGrid.yBound = this.yBound;
grid = new MineGrid[xBound][yBound];
mode = new boolean[xBound][yBound];
gridPanel = new JPanel();
gridPanel.setBackground(Color.GRAY);
//initialize grid panel
gridPanel.setLayout(null);
for(int x = 0; x < xBound; x++) {
for(int y =0; y < yBound; y++) {
grid[x][y] = new MineGrid(x,y);
grid[x][y].setIcon(ImageFactory.getInstance().getImageicon(9));
grid[x][y].setBounds(1+y*MineGrid.SIZE,x*MineGrid.SIZE,MineGrid.SIZE,MineGrid.SIZE);
grid[x][y].addMouseListener(gma);
gridPanel.add(grid[x][y],null);
}
}
gpd = new Dimension(yBound*MineGrid.SIZE+6, xBound*MineGrid.SIZE+6);
}//end of set grid panel
private void resetGridPanel() {
leftCount = 0;
int x,y,i,j;
boolean temp;
for(x = 0; x < xBound; x++) {
for(y =0; y < yBound; y++) {
grid[x][y].setIcon(ImageFactory.getInstance().getImageicon(9));
grid[x][y].setStatus(MineGrid.NORMAL);
//lay mines
if(leftCount < mineCount) {
mode[x][y] = true;
leftCount++;
} else {
mode[x][y] = false;
}
}
}
//exchange
showCount = leftCount;
for(x = 0; x < xBound; x++) {
for(y =0; y < yBound; y++) {
if(showCount==0) break;
i = (int)(Math.random()*xBound);
j = (int)(Math.random()*yBound);
temp = mode[x][y];
mode[x][y] = mode[i][j];
mode[i][j] = temp;
showCount--;
}
}
}
/*
*set up menu bar
*/
private void setMenuBar() {
JMenuBar menuBar = new JMenuBar();
menuBar.setBorder(BorderFactory.createLineBorder(Color.WHITE, 2));
JMenu gameMenu = new JMenu("游戏(G)");
JMenu helpMenu = new JMenu("帮助(H)");
gameMenu.setMnemonic('G');
helpMenu.setMnemonic('H');
startItem = new JMenuItem("开局(N)");
startItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F2,0));
logItem = new JMenuItem("扫雷英雄榜(T)...");
markCheckItem = new JCheckBoxMenuItem("标记(?)(M)");
exitItem = new JMenuItem("退出(X)");
aboutItem = new JMenuItem("关于扫雷(A)...");
startItem.setMnemonic('N');
exitItem.setMnemonic('X');
aboutItem.setMnemonic('A');
aboutItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1,0));
logItem.setMnemonic('T');
markCheckItem.setMnemonic('M');
markCheckItem.setSelected(markCheck);
gameMenu.add(startItem);
gameMenu.addSeparator();
//radio group
levelItem = new JRadioButtonMenuItem[4];
ButtonGroup levelGroup = new ButtonGroup();
levelItem[0] = new JRadioButtonMenuItem("初级(B)");
levelItem[1] = new JRadioButtonMenuItem("中级(I)");
levelItem[2] = new JRadioButtonMenuItem("高级(E)");
levelItem[3] = new JRadioButtonMenuItem("自定义(C)...");
levelItem[0].setMnemonic('B');
levelItem[1].setMnemonic('I');
levelItem[2].setMnemonic('E');
levelItem[3].setMnemonic('C');
for(int i=0;i<4;i++) {
levelGroup.add(levelItem[i]);
levelItem[i].addActionListener(this);
gameMenu.add(levelItem[i]);
}
levelItem[currentLevel].setSelected(true);
gameMenu.addSeparator();
gameMenu.add(markCheckItem);
gameMenu.addSeparator();
gameMenu.add(logItem);
gameMenu.addSeparator();
gameMenu.add(exitItem);
helpMenu.add(aboutItem);
startItem.addActionListener(this);
markCheckItem.addActionListener(this);
logItem.addActionListener(this);
exitItem.addActionListener(this);
aboutItem.addActionListener(this);
menuBar.add(gameMenu);
menuBar.add(helpMenu);
setJMenuBar(menuBar);
}
private void showAboutDialog() {
String readme = "";
File file = new File("readme.txt");
if(file.exists()) {
try {
BufferedReader input = new BufferedReader(new FileReader(file));
StringBuffer buffer = new StringBuffer();
String text;
while((text = input.readLine())!=null)
buffer.append(text+"\n");
input.close();
readme = buffer.toString();
} catch(IOException ioException) {}
}
AboutDialog dialog = new AboutDialog(this, "扫雷",readme,
ImageFactory.getInstance().getImageicon(14),
ImageFactory.getInstance().getImageicon(16));
dialog = null;
}
public void actionPerformed(ActionEvent ae) {
if(ae.getSource()==startItem) {
restartGame();
} else if(ae.getSource()==markCheckItem) {
markCheck = markCheckItem.isSelected();
} else if(ae.getSource()==logItem) {
//show heros
LogDialog dialog = new LogDialog(this, log);
dialog = null;
} else if(ae.getSource()==exitItem) {
writeLog();
System.exit(0);
} else if(ae.getSource()==aboutItem) {
showAboutDialog();
} else {
//radio buttons
int x;
for(x = 0; x < 3; x++) {
if(ae.getSource()==levelItem[x]) break;
}
if(x < 3) {
if(currentLevel!=x) {
currentLevel = x;
levelInfo = LevelInfo.DEFAULT_LEVEL[currentLevel];
resetPane();
}
} else {
LevelInfo newLevel = CustomDialog.getUserLevel(this, levelInfo);
if(newLevel!=null) {
currentLevel = x;
levelInfo = newLevel;
resetPane();
}
levelItem[currentLevel].setSelected(true);
}
}//radio buttons
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -