2012-10-31 47 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