/**
* File: ControlPanel.java
* User: Administrator
* Date: Dec 15, 2004
* Describe: 俄罗斯方块游戏的控制部分的实现
*/
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;
import java.awt.*;
import java.awt.event.*;
/**
* 控制面板类,继承JPanel.
* 上边安放预显即将出现的方块类型的窗口、难度级别、得分、控制按钮
* 主要用来控制游戏进程。
*/
class ControlPanel extends JPanel {
//用一个文本域显示难度级别
private JTextField
tfLevel = new JTextField("" + ErsBlocksGame.DEFAULT_LEVEL),
//用一个文本域显示玩家得分
tfScore = new JTextField("0");
//声明一组控制按钮
private JButton
btPlay = new JButton("开始"),
btPause = new JButton("暂停"),
btStop = new JButton("停止"),
btTurnLevelUp = new JButton("增加难度"),
btTurnLevelDown = new JButton("降低难度");
/**构造几个面板,分别摆放不同类型的构件
*/
//提示下一个游戏块的面板
private JPanel plTip = new JPanel(new BorderLayout());
private TipPanel plTipBlock = new TipPanel();
//显示游戏当前信息的面板,4行1列
private JPanel plInfo = new JPanel(new GridLayout(4, 1));
//存放控制按钮的面板,5行1列
private JPanel plButton = new JPanel(new GridLayout(5, 1));
private Timer timer;
//当前的游戏局
private ErsBlocksGame game;
//设置突出的EtchedBorder类型的边框
private Border border = new EtchedBorder(
EtchedBorder.RAISED, Color.white, new Color(148, 145, 140));
/**
* 主控制面板类的构造函数
* @param game ErsBlocksGame, ErsBoxesGame类的一个实例引用,
* 方便直接控制ErsBoxesGame类的行为。
*/
public ControlPanel(final ErsBlocksGame game) {
//整个控制面板有3个子面板,摆放在1列,
//每行的间距为4
setLayout(new GridLayout(3, 1, 0, 4));
this.game = game;
//预提示面板的两个构件及边界
plTip.add(new JLabel("下一个方块"), BorderLayout.NORTH);
plTip.add(plTipBlock);
plTip.setBorder(border);
//游戏信息显示面板的两个标签和两个文本域及边界
plInfo.add(new JLabel("难度级别"));
plInfo.add(tfLevel);
plInfo.add(new JLabel("得分"));
plInfo.add(tfScore);
plInfo.setBorder(border);
//两个文本域都是不可编辑的,只用于显示信息
tfLevel.setEditable(false);
tfScore.setEditable(false);
//按钮面板的五个按钮及边界
plButton.add(btPlay);
plButton.add(btPause);
plButton.add(btStop);
plButton.add(btTurnLevelUp);
plButton.add(btTurnLevelDown);
plButton.setBorder(border);
//将3个合成面板加入到主面板中
add(plTip);
add(plInfo);
add(plButton);
//增加键盘的监听器
addKeyListener(new ControlKeyListener()
);
//增加按钮的监听器
btPlay.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
game.playGame();
}
});
btPause.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
if (btPause.getText().equals(new String("暂停"))) {
game.pauseGame();
} else {
game.resumeGame();
}
}
});
btStop.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
game.stopGame();
}
});
btTurnLevelUp.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
try {
int level = Integer.parseInt(tfLevel.getText());
if (level < ErsBlocksGame.MAX_LEVEL)
tfLevel.setText("" + (level + 1));
} catch (Numb