2015-10-15 4 views
-1

Я воссоздаю очень плохую версию кликера cookie, чтобы немного проверить свои навыки. Ну, я столкнулся с проблемой, я не могу понять, как повторять цикл каждые 3 секунды. Main Class Код:While Loops - Timed

import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JPanel; 
import javax.swing.JFrame; 

public class CookieClickerGame { 
    private static final int FRAME_WIDTH = 200; 
    private static final int FRAME_HEIGHT = 200; 

    public static void main(String[] args) { 
     JPanel panel = new JPanel(); 

     JFrame frame = new JFrame(); 
     JButton cookie = new JButton("Cookie"); 
     JButton grandma = new JButton("Grandma"); 
     JButton robot = new JButton("Robot"); 
     panel.add(cookie); 
     panel.add(grandma); 
     panel.add(robot); 
     frame.add(panel); 

      /*----------------------------------------/ 
     /   Buttons     /
     /----------------------------------------*/ 
     ActionListener listener = new CookieClicker(); 
     cookie.addActionListener(listener); 

     ActionListener listener2 = new CookieClicker(); 
     grandma.addActionListener(listener2); 

     ActionListener listener3 = new CookieClicker(); 
     robot.addActionListener(listener3); 

      /*---------------------------------------------------------/ 
     /      Frame       /
     /---------------------------------------------------------*/ 
     frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 

Слушатель Код:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JOptionPane; 

public class CookieClicker implements ActionListener { 
    static int cookies; 
    public void actionPerformed(ActionEvent event) { 
     if (event.getActionCommand().equals("Cookie")) { 
      cookies++; 
      System.out.print('\f'); 
      System.out.println(cookies + " Cookies"); 
     } else if (event.getActionCommand().equals("Grandma") && cookies >= 10) { 
      System.out.println("+1 Grandma | -10 Cookies"); 
      cookies = cookies - 10; 
      System.out.println(cookies + " Cookies"); 
      while (true) { 
       cookies = cookies + 1; 
       System.out.print('\f'); 
       System.out.println(cookies + " Cookies"); 
       Thread.sleep(3000); 
       } 
     } else if (event.getActionCommand().equals("Robot") && cookies >= 50) { 
      System.out.println("+1 Robot | -50 Cookies"); 
      cookies = cookies - 50; 
      System.out.println(cookies + " Cookies"); 
      cookies = cookies + 1; 
      System.out.print('\f'); 
      System.out.println(cookies + " Cookies"); 
     } else { 
      JOptionPane.showMessageDialog (null, "Not Enough Cookies", "You're Poor", JOptionPane.INFORMATION_MESSAGE); 
      } 
     } 
    } 

Thread.sleep(3000) не работает, то, что случилось с ним?

+0

Определить 'не работает'. – John3136

+0

Взгляните на [Как использовать Swing Timers] (http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html) для [example] (http://stackoverflow.com/questions/ 18332135/java-for-loop-in-gui-textarea/18332315 # 18332315) – MadProgrammer

+0

surrond it with try..catch для начала –

ответ

1

Swing - это однопоточный фреймворк, вы никогда не должны пытаться выполнять какие-либо длительные операции или блокировать действия из контекста Event Dispatching Thread.

Посмотрите Concurrency in Swing для получения более подробной информации

В то время как вы могли бы использовать Thread, чтобы решить эту проблему, более простое решение было бы использовать свинг Timer, так как это обратные вызовы событий вызываются в контексте события Диспетчерская тему, что делает его безопасным для обновления пользовательского интерфейса внутри

How to use Swing Timers Смотреть подробнее

что-то вроде ...

} else if (event.getActionCommand().equals("Grandma") && cookies >= 10) { 
    System.out.println("+1 Grandma | -10 Cookies"); 
    cookies = cookies - 10; 
    System.out.println(cookies + " Cookies"); 
    if (timer == null || !timer.isRunning()) { 
     timer = new Timer(3000, new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       cookies = cookies + 1; 
       System.out.print('\f'); 
       System.out.println(cookies + " Cookies"); 
       // I don't know what your exit condition is, but you can use 
       // ((Timer)e.getSource()).stop(); 
       // to stop the timer from repeating 
      } 

     }); 
     timer.start(); 
    } 
} 

например

+0

Спасибо за это! –