Java画图方法未更新变量值

时间:2018-09-25 11:21:50

标签: java multithreading draw

我不知道发生了什么事。

这是我的课程

public class MyGame extends JPanel implements ActionListener, KeyListener {

private static final long serialVersionUID = 1L;

private Timer timer;

private Image plyr;

public int x, y, x_pelota, y_pelota;
private boolean up, down, left, right;

public MyGame(){

    resetArrows();

    ImageIcon pertsonaiaIcon = new ImageIcon(this.getClass().getResource("img/plyr.png"));
    pertsonaia = pertsonaiaIcon.getImage();

    timer = new Timer(15, this);
    timer.start();
}

private void resetArrows() {
    up = false;
    down = false;
    left = false;
    right = false;
}

public boolean updatePosition(String object, int x, int y) {
    if (object.equals("Player")){
        if (up) {
            this.y = y + 5;
            this.x = x;
        }else if (down) {
            this.y = y - 5;
            this.x = x;
        }else if (left) {
            this.x = x - 5;
            this.y = y;
        }else if (right) {
            this.x = x + 5;
            this.y = y;
        }else {
            this.x = x;
            this.y = y;
        }
    }else {
        //Mover pelota
    }

    resetArrows();

    //if (Math.abs(x - x_pelota) < 2 && Math.abs(y - y_pelota) < 2)
        //return false;

    return true;
}

@Override
public void paint(Graphics g){
    super.paint(g);
    System.out.println(this.x);
    g.drawImage(plyr, this.x, this.y, this);
}

@Override
public void actionPerformed(ActionEvent e){ 
    repaint();
}

@Override
public void keyPressed(KeyEvent e) {
    int keyCode = e.getKeyCode();

    switch(keyCode) { 
    case KeyEvent.VK_UP:
        resetArrows();
        up = true;
        break;
    case KeyEvent.VK_DOWN:
        resetArrows();
        down = true;
        break;
    case KeyEvent.VK_LEFT:
        resetArrows();
        left = true;
        break;
    case KeyEvent.VK_RIGHT :
        resetArrows();
        right = true;
        break;
    }   
}

@Override
public void keyReleased(KeyEvent e) {}

@Override
public void keyTyped(KeyEvent e) {}

}

我在另一个类中有一个线程,该线程调用该类的updatePosition方法,该方法应该更新x和y变量值,并且确实可以!我尝试打印this.x和this.y值,并且值已更新,但是paint方法的值为0,我不明白为什么。

我不知道这是否是因为我正在使用线程...我不知道该怎么解决这个问题。

1 个答案:

答案 0 :(得分:2)

  

我不知道是否是因为我正在使用线程...

是!允许JVM给每个线程一个自己的变量的副本。如果要使一个线程的更改在另一个线程中可见,则必须同步访问或将变量标记为volatile。一次更改两个变量似乎更合适。

作为一种快速的解决方案,请按以下方式编辑您的方法:

public synchronized boolean updatePosition(...) { ... }
public synchronized boolean paint(...) { ... }