Java i';我正在创建一个彩色游戏,如何更新run()方法中的变量?

Java i';我正在创建一个彩色游戏,如何更新run()方法中的变量?,java,runnable,actionevent,Java,Runnable,Actionevent,这个按钮启动/停止颜色模具的随机变化,但当我单击按钮时,布尔值starter变为“false”,但在run()方法中它从未改变 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.Ran

这个按钮启动/停止颜色模具的随机变化,但当我单击按钮时,布尔值
starter
变为“false”,但在run()方法中它从未改变

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
}

您正在使用两个不同的线程访问同一个局部变量。在Java中,每个线程都可以缓存itsef变量的值。要防止出现这种情况,请将变量声明为volatile:

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");
                }
    }

另请参见

我知道您可能认为这没有关系,但事实是:请尝试使用代码格式来组织代码。代码将变得更具可读性。大多数当前的Java编辑器都可以自动为您应用代码样式。当代码可读性更强时,您更有可能找到有问题的代码部分。对不起,先生。。我是新来的,所以我正在努力应付。顺便说一下,谢谢你的建议,别担心。这不是抱怨,而是对您的编程的建议。最好尽早开始组织代码。它还提高了学习速度。可读性(有时是可维护性)比大多数人认为的更重要嗯。。“volatile”是做什么的?抱歉,我在java中是平均值“…volatile修饰符保证任何读取字段的线程都会看到最近写入的值。”- Josh BlochIt基本上确保线程没有看到当访问值时可能导致的无效值,而另一个线程处于重写值的中间。当我按下开始按钮时,颜色骰子停止生成布尔值“starter=false”,并将其标签更改为“stop”,但当我单击带有标签“stop”的按钮时,变量“starter”变为“true”,但颜色骰子停止其操作randomization@KimInopia这是因为您从
run
返回。
volatile boolean starter = true;