2014-12-30 2 views
0
package myPackage; 
import java.applet.Applet; 
import java.awt.Button; 
import java.awt.Graphics; 
import java.awt.event.*; 
import java.awt.Color; 
import java.awt.Font; 
import java.util.Random; 

public class Colorgame extends Applet implements Runnable , ActionListener{ 

boolean starter = true; 

public void init(){ 
     this.setSize(800, 650); 
     this.setLayout(null); 
     this.setBackground(Color.pink); 
     myFont = new Font("Times New Roman",Font.BOLD,20); 
     new Thread(this).start(); 

     //button 
     start = new Button("Start"); 
     start.setBounds(370, 610, 50, 30); 
     start.addActionListener(this); 

     add(start); 
} 


public void run(){ 
     while(starter){ 
     try{ 
      ranColor = rand.nextInt(6); 
      switch (ranColor) { 
      case 0: 
       dieColor = Color.red; 
       Thread.sleep(100); 
       repaint(); 
       break; 
      case 1: 
       dieColor = Color.blue; 
       Thread.sleep(100); 
       repaint(); 
       break; 
      case 2: 
       dieColor = Color.green; 
       Thread.sleep(100); 
       repaint(); 
       break; 
      case 3: 
       dieColor = Color.yellow; 
       Thread.sleep(100); 
       repaint(); 
       break; 
      case 4: 
       dieColor = Color.orange; 
       Thread.sleep(100); 
       repaint(); 
       break; 
      case 5: 
       dieColor = Color.magenta; 
       Thread.sleep(100); 
       repaint(); 
       break; 
      default: 
       break; 
      } 
     }catch(Exception e){ 

     } 
    } 

} 

public void paint(Graphics g){ 
    g.setColor(dieColor); 
    g.fillRect(355, 90, 80, 80); //colour die 
} 

и эта кнопка запускает/останавливает случайные изменения цветовой матрице, но когда я нажал на кнопку булево starter становится «ложным», но в методе Run() он никогда не изменяетЯ создаю цветную игру, как я могу обновить переменную в методе run()?

public void actionPerformed(ActionEvent e) { 
      if(e.getSource() == start){ 
       if(starter == true){ 
        starter = false; 
        start.setLabel("Stop"); 
       } 
       else if(starter == false){ 
        starter = true; 
        start.setLabel("Start"); 
       } 
    } 
+1

Я знаю, что вы могли бы подумать, что это не связано, но это: Пожалуйста, попробуйте использовать код форматирования, чтобы организовать свой код. Код станет намного читабельнее. Большинство современных редакторов Java могут автоматически применять стиль кода для вас. Когда код становится более читаемым, у вас есть больше шансов найти разделы проблемных кодов. – brimborium

+0

Извините, сэр. Я здесь новый, поэтому я пытаюсь справиться. Кстати, спасибо за совет –

+0

Не волнуйся. Это была не жалоба, а совет для вашего программирования. Лучше начинать как можно раньше с организации кода. Это также увеличивает скорость обучения. Читаемость (а иногда и ремонтопригодность) важнее, чем думают многие. ;) – brimborium

ответ

2

Вы находитесь используя 2 разных потока для доступа к одной и той же локальной переменной. В Java каждый поток может кэшировать значение переменной для itsef. Чтобы предотвратить это, объявить переменную как летучий:

volatile boolean starter = true; 

http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html Смотрите также

+0

uhm .. что делает «volatile»? Извините, я в среднем в java –

+2

«... изменчивый модификатор гарантирует, что любой поток, который читает поле, увидит самое последнее написанное значение». - Josh Bloch – brimborium

+0

В основном он гарантирует, что нить не увидит недопустимое значение, которое может возникать при доступе к значению, а другой поток находится в середине перезаписи значения. – brimborium

 Смежные вопросы

  • Нет связанных вопросов^_^