2012-10-31 84 views
0

是否有人可以告诉我怎样能得到INT x的值在我下面的代码: 当我移动离开了广场,右,从测试输出保持为500int为什么没有改变? java的

我想在Thread测试每次循环时获取x的值,但即使x的值在Drawing.java中更改,x始终为500(来自线程)。请帮我解决一下这个。

package block; 


public class Test extends Drawing implements Runnable{ 
Thread collision = new Thread(this); 

public Test() { 
    collision.start(); 
} 

@Override 
public void run() { 

    while(true) { 
     System.out.println(x); 
    } 
} 

} 

package block; 

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.util.logging.Level; 
import java.util.logging.Logger; 


public class Drawing extends Canvas implements Runnable, KeyListener{ 
Thread thread = new Thread(this); 

int x = 500; 
int y = 540; 
public Drawing() {   
    setSize(1000, 800); 
    addKeyListener(this); 
    thread.start(); 
} 

public void update(Graphics g) { 
    g.setColor(Color.WHITE); 
    g.fillRect(0, 0, 1000, 700); 
    paint(g); 
} 

public void paint(Graphics g) { 
    g.setColor(Color.cyan); 
    g.fillRect(x, y, 50, 50); 
} 

@Override 
public void run() { 
    while(true) { 
     repaint(); 
     try { 
      Thread.sleep(100); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(Drawing.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 

} 

@Override 
public void keyTyped(KeyEvent ke) { 

} 

@Override 
public void keyPressed(KeyEvent ke) { 
    if(ke.getKeyCode() == KeyEvent.VK_LEFT) { 
     x -= 5; 
    } 
    if(ke.getKeyCode() == KeyEvent.VK_RIGHT) { 
     x += 5; 
    } 
} 

@Override 
public void keyReleased(KeyEvent ke) { 

} 

} 

编辑:--------------------

package block; 

import javax.swing.JFrame; 


public class Block extends JFrame{ 

    Test test = new Test(); 

    public Block() { 
     setSize(1000, 700); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null);   
     add(new Drawing());   
     setVisible(true); 
     createBufferStrategy(2); 
    } 

    public static void main(String[] args) { 
     new Block(); 
    } 
} 
+0

哪里是你的代码,调用这些对象呢?我希望你可以通过创建多个'Drawing'对象来创建'x'的多个实例。 (如果你只创建一个两个线程,那么只有你的'Test.run()'方法将被调用,并且没有图纸会发生。) –

+0

生病添加上述 – user1776707

+1

你滥用继承我唯一的其他类。 Test类的run方法将覆盖Drawing的run方法。没有测试扩展绘图。期。 –

回答

2

您正在创建的x因为多个实例您没有正确使用继承。当你调用new Test(),创建一个Test的一个实例(其中包含Drawing,其中包含一个成员x),然后调用new Drawing()创建Drawing的另一个实例(其中包含不同成员x)。

为了解决这个问题,你可以通过一个参考Drawing对象添加到您Test构造,并通过参考访问x成员。

+0

我该怎么做?我试过,但没有完全理解你的说法 - 对不起 – user1776707

+0

谢谢,你带领我在正确的方向,我解决了。 – user1776707