java - boolean 值无法正确更新,除非您打印它

标签 java swing applet boolean

所以我正在制作这个java小程序,我只想首先确保按键输入正常工作,然后再使其变得更复杂。我不知道为什么,但是当你删除“System.out.print(needUpdating);”时它没有根据按键输入正确移动矩形。谁能告诉我为什么以及如何解决它?这对我来说完全是个谜。

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;    
import javax.swing.JApplet;    

public class firstApplet extends JApplet implements KeyListener, Runnable {
    final int MOVEAMOUNT = 1;       
    boolean needUpdating;       
    int x,y,dx,dy;      
    Thread runner = null;

    public void init() {
        this.setFocusable(true);            
        needUpdating = false;           
        this.requestFocusInWindow();            
        x=0;            
        y=0;            
        dx=0;           
        dy=0;           
        addKeyListener(this);
    }

    public void stop() {            
    }

    public void start() {
        runner = new Thread(this);          
        runner.start();
    }

    public void paint(Graphics g) {
        System.out.println("x= "+x+" y = "+y);          
        g.drawRect( x, y, 100, 15 );
    }

    @Override
    public void keyPressed(KeyEvent e) {                        
        int key = e.getKeyCode();           
        if(key==KeyEvent.VK_UP) {
            System.out.println("up");
            dy=MOVEAMOUNT;
        }
        else if (key==KeyEvent.VK_DOWN) {
            dy=-MOVEAMOUNT;
        }
        else if (key==KeyEvent.VK_LEFT) {
            dx=-MOVEAMOUNT;
        }
        else if (key==KeyEvent.VK_RIGHT) {
            dx=MOVEAMOUNT;
        }
        // TODO Auto-generated method stub          
        needUpdating = true;            
        System.out.println("needUpdating listening = " +needUpdating);
    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub
        dx=0;
        dy=0;
    }

    @Override
    public void keyTyped(KeyEvent e) {          
    }

    public void processMovement() {
        System.out.println("processing");
        x+=dx;
        y+=dy;
    }

    @Override
    public void run() {
        this.addKeyListener(this);
        while(true) {
            System.out.print(needUpdating);             
            if(needUpdating) {
                processMovement();                  
                repaint();                  
                needUpdating=false;
            }           
        }           
    }
}

最佳答案

您的代码未正确同步。更好地说,它根本不同步。然而,System.out.println 是一个同步方法,在当今典型的 CPU 架构上,进入同步块(synchronized block)恰好是在 native 代码级别实现为内存屏障 。这具有使 boolean 值的更改对其他线程可见的效果。

结论:正确同步你的代码,“神奇”的行为就会消失。

关于java - boolean 值无法正确更新,除非您打印它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17427176/

相关文章:

java - ArrayIndexOutOfBoundsException 错误消息

java - 用图形制作棋盘样式(java applet)

当给定 jsession id 时,Java Applet 似乎使用旧的响应对象

java - Thymeleaf 内容助手无法与 Spring Boot 一起使用

Java 堆转储文件 (.hprof) 比 Eclipse MAT 中的堆大小大得多

java - 可以用 Swing Timer 以更优雅的方式完成吗?

java - FontMetrics 返回错误的高度

ios - 在没有付费苹果开发者帐户的情况下在 swift 中使用应用内购买

java - local_policy.jar 和 US_export_policy.jar 与 Unlimited Strength Vs Default 不同。

java - 在 Cassandra 中执行删除操作时获取数据库条目