我想在自己的扫雷程序上加个计时器..
class TTask extends TimerTask{
public void run(){
timeSum++;
timeField.setText("时间:"+Integer.toString(timeSum));
}
}揭开第一个雷区的方块后执行:
timer= new Timer();
timer.schedule(new TTask(),0,1000);=========以下问题=========
第一遍可以计时的..
第一遍结束后执行timer.cancel();开始玩第二遍,此时计时器暂停在那边了
不执行timer.cancel();的话,没点雷区就会自动开始计时...怎么办啊?
class TTask extends TimerTask{
public void run(){
timeSum++;
timeField.setText("时间:"+Integer.toString(timeSum));
}
}揭开第一个雷区的方块后执行:
timer= new Timer();
timer.schedule(new TTask(),0,1000);=========以下问题=========
第一遍可以计时的..
第一遍结束后执行timer.cancel();开始玩第二遍,此时计时器暂停在那边了
不执行timer.cancel();的话,没点雷区就会自动开始计时...怎么办啊?
==========全部代码附上,==============
import java.awt.*;
import java.lang.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.text.DecimalFormat;
import java.util.TimerTask;
import java.util.Timer;
import java.util.Random;public class Saolei implements ActionListener,MouseListener{
JFrame frame;
JPanel panel, panel1, panel2, panel3;
JMenuBar mainMenu;
JButton button[];
JMenu gameMenu,helpMenu;
JMenuItem startItem, recordItem, exitItem, helpItem, aboutItem;
JTextArea help;
JTextField timeField, numberField, infoField;
JScrollPane scrollHelp;
int index,blackNum=0,redNum=0,dileiNum,mod,mouseB=2,judgeNum=0,timeSum=0,timeTime=0;
int[] dilei;
boolean[] dileiFT;
Timer timer ;
//布局
public Saolei() {
frame = new JFrame("扫雷");
panel = new JPanel();
frame.getContentPane().add(panel);
panel.setLayout(new BorderLayout());
panel1 = new JPanel();
panel1.setPreferredSize(new Dimension(300,40));
panel2 = new JPanel();
panel2.setPreferredSize(new Dimension(500,500)); //菜单
mainMenu = new JMenuBar();
gameMenu = new JMenu("游戏");
helpMenu = new JMenu("帮助");
startItem = new JMenuItem("开局");
recordItem = new JMenuItem("排名");
exitItem = new JMenuItem("退出");
helpItem = new JMenuItem("帮助");
aboutItem = new JMenuItem("关于");
mainMenu.add(gameMenu);
mainMenu.add(helpMenu);
gameMenu.add(startItem);
gameMenu.add(recordItem);
gameMenu.add(exitItem);
helpMenu.add(helpItem);
helpMenu.add(aboutItem);
startItem.addActionListener(this);
recordItem.addActionListener(this);
exitItem.addActionListener(this);
helpItem.addActionListener(this);
aboutItem.addActionListener(this);
help = new JTextArea(8, 40);
scrollHelp = new JScrollPane(help);
help.setEditable(false);
help.append("扫雷玩法\n");
help.append("1.在“游戏”菜单上,单击“开局”。\n");
help.append("2.要启动计时器,请单击游戏区中的任何方块。\n");
help.append("=======================\n");
help.append("注意:\n");
help.append("1.通过单击即可挖开方块。如果挖开的是地雷,则您输掉游戏。\n");
help.append("2.如果方块上出现数字,则表示在其周围的八个方块中共有多少颗地雷。\n");
help.append("3.要标记您认为可能有地雷的方块,请右键单击它。 \n");
help.append("4.游戏区包括雷区、地雷计数器和计时器。\n");
panel.add(mainMenu, BorderLayout.NORTH);
panel.add(panel1, BorderLayout.CENTER);
panel.add(panel2, BorderLayout.SOUTH);
//时间 剩余地雷数显示
panel1.setLayout(new BorderLayout());
numberField = new JTextField();
numberField.setPreferredSize(new Dimension(80,40));
numberField.setEditable(false);
numberField.setBackground(new Color(217, 217, 217));
panel1.add(numberField, BorderLayout.WEST);
timeField = new JTextField("时间:"+Integer.toString(timeSum));
timeField.setPreferredSize(new Dimension(80,40));
timeField.setEditable(false);
timeField.setBackground(new Color(217, 217, 217));
panel1.add(timeField, BorderLayout.EAST);
infoField = new JTextField();
infoField.setText("扫雷测试版");
infoField.setEditable(false);
infoField.setBackground(new Color(217, 217, 217));
panel1.add(infoField, BorderLayout.CENTER);
//游戏面板
panel2.setLayout(new GridLayout(9,9));
button = new JButton[81];
for (int i = 0; i < button.length; i++) {
button[i] = new JButton("");
button[i].setBackground(Color.BLACK);
panel2.add(button[i]);
button[i].addMouseListener(this);
button[i].addActionListener(this);
}
Start();
//窗口
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
frame.setResizable(false);
}
public void Start() {
dileiFT = new boolean[81];
redNum = 0;
blackNum = 0;
mouseB=2;
judgeNum=0;
timeSum=0; timeField.setText("时间:"+Integer.toString(timeSum));
for (int i = 0; i < 81; i++) {
button[i].setBackground(Color.BLACK);
button[i].setText("");
dileiFT[i]=false;
}
numberField.setText("剩余地雷:"+Integer.toString(10 - redNum));
dilei=new int[10];
int j=1;
dilei[0]=(int)(Math.random()*81);
while(j<dilei.length){
dilei[j]=(int)(Math.random()*81);
boolean b=true;
for(int k=0;k<j;k++){
if(dilei[j]==dilei[k]){
b=false;
}
}
if(b==true)
j++; }
for(int i=0;i<10;i++){
dileiFT[(dilei[i])] = true;
}
}
//判断
public void Judge(int i,int m){
if(dileiFT[i] == true&&m == 0){
for(int j=0;j<10;j++){
button[(dilei[j])].setBackground(Color.GREEN);
}
JOptionPane.showMessageDialog(panel, "你输了!");
Start();
}
if(dileiFT[i]==false&&m==0){
int dileiSum = 0;
if(dileiFT[i+1]==true) dileiSum++;
if(dileiFT[i-1]==true) dileiSum++;
if(dileiFT[i-10]==true) dileiSum++;
if(dileiFT[i-9]==true) dileiSum++;
if(dileiFT[i-8]==true) dileiSum++;
if(dileiFT[i+8]==true) dileiSum++;
if(dileiFT[i+9]==true) dileiSum++;
if(dileiFT[i+10]==true) dileiSum++;
for(int a=1;a<9;a++){
if(i==9*a+1&&dileiFT[i-1]==true) dileiSum--;
}
for(int a=1;a<9;a++){
if(i==9*a&&dileiFT[i+1]==true) dileiSum--;
}
if(dileiSum!=0)
button[i].setText(Integer.toString(dileiSum));
else button[i].setText("");
}
judgeNum=0;redNum=0;
for(int c=0;c<81;c++){
if(button[c].getBackground()==Color.BLUE)
judgeNum++;
if(button[c].getBackground()==Color.RED)
redNum++;
if(button[c].getBackground()==Color.BLACK)
blackNum++;
}
if(judgeNum==71){
JOptionPane.showMessageDialog(panel, "你赢了!时间:"+Integer.toString(timeSum));
Start();
}
numberField.setText("剩余地雷:"+Integer.toString(10 - redNum));
}
//计时
class TTask extends TimerTask {
public void run() {
timeSum++; timeField.setText("时间:"+Integer.toString(timeSum)); }
}
//鼠标
public void mouseClicked(MouseEvent e) {
if(blackNum==80)
{timer= new Timer();
timer.schedule(new TTask(),0,1000);}
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
mod = e.getModifiers();
switch(mod){
case InputEvent.BUTTON1_MASK:
{((JButton)e.getSource()).setBackground(Color.BLUE);
for(int i=0;i<81;i++){
if((JButton)e.getSource()==button[i])
index =i;mouseB=0;
}
break;
}
case InputEvent.BUTTON3_MASK:
{((JButton)e.getSource()).setBackground(Color.RED);
for(int i=0;i<81;i++){
if((JButton)e.getSource()==button[i])
index = i;mouseB=1;
}
break;
}
default:break;
}
Judge(index,mouseB);
}
public void mouseReleased(MouseEvent e) {
}
//设置各个按钮行为
public void actionPerformed(ActionEvent event) {
Object temp = event.getSource();
try{
//按下"开局"
if (temp == startItem) {
Start();
}
//按下"排名"
if (temp == recordItem) {
for(int j=0;j<10;j++){
button[(dilei[j])].setBackground(Color.GREEN);
}
}
//按下"退出"
if (temp == exitItem) {
System.exit(0);
}
//按下"帮助"
if (temp == helpItem) {
JOptionPane.showMessageDialog(panel, scrollHelp);
}
//按下"关于"
if (temp == aboutItem) {
JOptionPane.showMessageDialog(panel, " 扫雷测试版\n开发者:MagicWolf");
}
}
catch (Exception e) {
}
}
public static void main(String args[]) {
new Saolei();
}
}
ChDw(米) ( ) 信誉:155 Blog 2007-2-8 18:08:18 得分: 0
你是否每次都重新创建一个新的Timer与TimerTask了?
==============================
我让它每次揭开第一个方块的时候就执行下面的代码,
算不算"每次都重新创建一个新的Timer与TimerTask"timer= new Timer();
timer.schedule(new TTask(),0,1000);
public void run(){
if (starFlag){
timeSum++;
timeField.setText("时间:"+Integer.toString(timeSum));
}
}
}开始的时候把starFlag设置成true
timer.cancel();加在start()前边,因为进程一直在进行中