我想在自己的扫雷程序上加个计时器..
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();的话,没点雷区就会自动开始计时...怎么办啊?

解决方案 »

  1.   

    想不来...想了好几个小时了..而且API也看不懂..只有C语言的基础,JAVA昨天看了一个教程后依照一个计算器的代码写的扫雷代码
    ==========全部代码附上,==============
    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); 
               }
        
      

  2.   

    //开局布雷
        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(); 
        }     
    }
      

  3.   

    你是否每次都重新创建一个新的Timer与TimerTask了?
      

  4.   

    问题好大啊我觉得你还不如直接用JFarm开发出来的比较好。这样写的全都是错误。我还在测试和修改当中
      

  5.   

    呵呵....我没有JAVA基础..这是我第一写JAVA程序.都是由着自己的想法来的...
      

  6.   

    ==============================
    ChDw(米) ( ) 信誉:155    Blog  2007-2-8 18:08:18  得分: 0  
    你是否每次都重新创建一个新的Timer与TimerTask了?
    ==============================
     
    我让它每次揭开第一个方块的时候就执行下面的代码,
    算不算"每次都重新创建一个新的Timer与TimerTask"timer= new Timer();
    timer.schedule(new TTask(),0,1000);
      

  7.   

    static boolean starFlag=false;class TTask extends TimerTask{
        public void run(){
          if (starFlag){
            timeSum++;
            timeField.setText("时间:"+Integer.toString(timeSum));
          }
        }
    }开始的时候把starFlag设置成true
      

  8.   

    找到了。
    timer.cancel();加在start()前边,因为进程一直在进行中