paint()方法不接受Java中更新的变量

paint()方法不接受Java中更新的变量,java,swing,jframe,Java,Swing,Jframe,我试图在tryCar方法中绘制生成到一个名为cars的ArrayList中的汽车,当我调用System.out.printlnCars.size时,它会打印出正确的大小;但一旦我尝试在绘画方法中绘制它,它就不会识别它。 这是我的密码。 r是java.util.Random中的随机变量 以下是整个课程: public class Game extends JPanel { private static final long serialVersionUID = 1L; int CARS = 20;

我试图在tryCar方法中绘制生成到一个名为cars的ArrayList中的汽车,当我调用System.out.printlnCars.size时,它会打印出正确的大小;但一旦我尝试在绘画方法中绘制它,它就不会识别它。 这是我的密码。 r是java.util.Random中的随机变量

以下是整个课程:

public class Game extends JPanel {
private static final long serialVersionUID = 1L;
int CARS = 20;
int cars = 0;
ArrayList Cars = new ArrayList();
Player p1 = new Player(20,20);
Environment Road = new Environment(1);
Random r = new Random();
public void Update(){
    System.out.println("c");
    if(r.nextInt(100)>85){
        System.out.println("e");
        tryCar();
    }
    p1.Move(Main.c);
}
void tryCar(){
    if(r.nextBoolean()){
        System.out.println("v");
        Car c = new Car(r.nextInt(2), r.nextInt(6)+6, r.nextBoolean());
        Cars.add(c);
        cars++;
            System.out.println(Cars.size());
    }
}

public void paint(Graphics g) {
    super.paint(g);
    this.setVisible(true);
    this.setBackground(Color.BLACK);
    Road.drawLvl(g);
    g.setColor(new Color(255,0,0));
    //      System.out.println(p1.X);
    System.out.println(Cars.size());
    g.fillRect(p1.X,p1.Y,p1.W,p1.H);
    for(int i = 0; i<Cars.size(); i++){ 
        System.out.println("s");
        Car c = (Car) Cars.get(i);
        g.setColor(new Color((r.nextInt(2)*255),(r.nextInt(2)*255),(r.nextInt(2)*255)));
        g.fillRect(c.X,c.Y,c.W,c.H);
    }
}

}

通过更新方法将汽车添加到汽车中。如果在油漆中,数组是空的,那是因为没有将汽车添加到汽车中。因此,只需确保调用了Update方法,否则数组将始终为空-除非您直接修改数组,而不是通过Update进行修改。

让我们从Swing image rally不是线程安全的事实开始,这意味着在大多数情况下,对UI的任何更新都应该在事件调度线程的上下文中完成

通常,javax.swing.Timer是安排需要修改UI状态的常规回调的首选机制

此外,重新绘制主窗口可能不足以导致子组件重新绘制

在链接代码示例中,可以从update方法调用repaint,这里的危险在于,在绘制组件时可能会修改状态,从而导致输出不一致

这就是为什么我建议改用javax.swing.Timer,因为它允许您在EDT的上下文中更新状态,EDT也负责执行绘制更新,这意味着几乎不可能同时更新和绘制状态


一般来说,Swing组件应该覆盖paintComponent以执行自定义绘制

,但一旦我尝试在print方法中绘制它,它就无法识别它。-什么打印方法??不要直接在JFrame内部绘制。相反,阅读图坦卡蒙在秋千上画画。对不起,我是说画画,威尔fix@HovercraftFullOfEels即使我在其他东西上画画,我也需要使用Swing的paint或paintComponent方法,对吗?定义它不识别它。发生了什么,什么时候,你期望什么。另外,请遵守Java命名约定:变量和方法以小写字母开头。然后,要么您没有向我们显示真实代码,要么某个方法在调用paint之前更改了汽车列表。-1,尝试在paint内部添加一个更新调用paint方法不应更新其自身的状态,而应仅绘制其状态。这很有效,但我觉得从痛苦中调用Update有点不舒服,有没有办法从另一个类调用并确保它更新?如果您检查上面的内容,您可以看到我当前是如何更新Main.javaDo中的类的。这只是一个夸张的说法,表明应该调用Update。
public class Game extends JPanel {
private static final long serialVersionUID = 1L;
int CARS = 20;
int cars = 0;
ArrayList Cars = new ArrayList();
Player p1 = new Player(20,20);
Environment Road = new Environment(1);
Random r = new Random();
public void Update(){
    System.out.println("c");
    if(r.nextInt(100)>85){
        System.out.println("e");
        tryCar();
    }
    p1.Move(Main.c);
}
void tryCar(){
    if(r.nextBoolean()){
        System.out.println("v");
        Car c = new Car(r.nextInt(2), r.nextInt(6)+6, r.nextBoolean());
        Cars.add(c);
        cars++;
            System.out.println(Cars.size());
    }
}

public void paint(Graphics g) {
    super.paint(g);
    this.setVisible(true);
    this.setBackground(Color.BLACK);
    Road.drawLvl(g);
    g.setColor(new Color(255,0,0));
    //      System.out.println(p1.X);
    System.out.println(Cars.size());
    g.fillRect(p1.X,p1.Y,p1.W,p1.H);
    for(int i = 0; i<Cars.size(); i++){ 
        System.out.println("s");
        Car c = (Car) Cars.get(i);
        g.setColor(new Color((r.nextInt(2)*255),(r.nextInt(2)*255),(r.nextInt(2)*255)));
        g.fillRect(c.X,c.Y,c.W,c.H);
    }
}