2015-10-14 67 views
-1

我試圖在隨機移動的屏幕上創建多個字符(方塊)。我已經創建了一個創建正方形的CharMove類,並在屏幕上隨機移動它。然而,我試圖在一個單獨的java文件中創建這個類的多個實例,並且只創建了一個實例。哪裏不對?無法在Java中創建一個類的多個實例

CharMove類:

public class CharMove extends JPanel { 
    public static int x = 250; 
    public static int y = 250; 

    public void paint(Graphics g) { 
     Graphics pane = (Graphics2D) g; 
     pane.setColor(Color.blue); 
     pane.fillRect(x, y, 10, 10); 

    } 

    public static void movement(int x, int y, JFrame frame) { 
     CharMove.x = x; 
       CharMove.y = y; 
     while (true) { 
      try { 
       TimeUnit.SECONDS.sleep(1); 
       CharMove.x = Getx(CharMove.x,frame); 
       CharMove.y = Gety(CharMove.y,frame); 
       frame.repaint(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public static int Getx(int a, JFrame frame) { 
     Random rn = new Random(); 
     int xnum = rn.nextInt(10)-5; 
     a += xnum; 
     System.out.println("x:" + a); 
     return a; 
    } 
    public static int Gety(int b, JFrame frame){ 
     Random rn = new Random(); 
     int ynum = rn.nextInt(10)-5; 
     b += ynum; 
     System.out.println("y:" + b); 
     return b; 
    } 
} 

世界級

public static void main(String[] args) { 
    JFrame game = new JFrame(); 
    game.setTitle("Matrix"); 
    game.setSize(500, 500);; 
    game.getContentPane().setBackground(Color.white); 
    game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    game.setVisible(true); 
    CharMove char1 = new CharMove(); 
    CharMove char2 = new CharMove(); 
    game.add(char1); 
    game.add(char2); 
    char1.movement(100,100,game); 
    char2.movement(250,250,game); 
} 
+1

哪裏錯誤?什麼是預期的輸出?什麼是「不起作用」? –

+1

我想問題是你並不是想讓x和y變成靜態的。刪除「靜態」,它會按照您期望的方式工作。 – Arsen

+0

問題是隻有一個正方形出現,因此無論是隻創建一個實例還是正在創建兩個相同的實例。預期的輸出是在屏幕上隨機移動的兩個正方形。 – Ninjaman494

回答

2

However, I tried creating multiple instances of this class in a seperate java file and only 1 instance was created.

不,你正在創建多個實例。但是,這沒有任何區別,因爲您沒有任何每個實例的狀態。你唯一的領域是這些:

public static int x = 250; 
public static int y = 250; 

這些都是靜態領域,這意味着它們不相關的類的任何特定實例。您可能只想從聲明中刪除static關鍵字。 (如果有必要,我還會將這些字段設置爲私有的並提供公共getter/setter,但這是另一回事。)

您還需要將靜態方法變爲實例方法 - 因爲它們的目的是要採取行動在個別情況下,對嗎?基本上,我認爲你應該通過任何你用來學習Java的書/教程來修改static的含義。 (也修改Java命名約定。)

+0

適用於Java命名約定。很好地對代碼進行格式化(使用任何適合你的代碼風格)通常也有幫助。 – brimborium

+0

如果我從x和y中刪除靜態,則會創建編譯器錯誤:「無法對非靜態字段CharMove.x創建靜態引用」 – Ninjaman494

+1

@ Ninjaman44:然後,您還需要修復該問題。基本上,你想操作實例......你應該根據這個變化來查看*所有*你的代碼。 –

0

你不應該使用public static void movement()因爲它不是實例方法(當然名字說出來,它是靜態的)。事實上,你的代碼不應該能夠在char1.movement(100,100,game);編譯。 應該聲明它爲實例方法public void movement()。實際上,對於其他方法,您可能也想這樣做。沒有實例的類的靜態工作。

+3

代碼應該能夠編譯,因爲Java允許您訪問靜態成員通過實例。它吸收國際海事組織,但這就是JLS所說...... –

+0

爲什麼它不應該編譯?您可以使用實例調用靜態方法。雖然我從來不明白爲什麼。 :) – brimborium

+0

哦,永遠不要嘗試它,但很高興知道。謝謝! – smurf

0

您的x和y不是實例變量,它們是靜態變量。所以CharMove的每個實例共享相同的X和Y

試試這個,

public class CharMove extends JPanel { 
    private int x = 250; 
    private int y = 250; 

    public void paint(Graphics g) { 
     Graphics pane = (Graphics2D) g; 
     pane.setColor(Color.blue); 
     pane.fillRect(x, y, 10, 10); 

    } 

    public void movement(JFrame frame) { 
     while (true) { 
      try { 
       TimeUnit.SECONDS.sleep(1); 
       this.x = CharMove.Getx(this.x,frame); 
       this.y = CharMove.Gety(this.y,frame); 
       frame.repaint(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public static int Getx(int a, JFrame frame) { 
     Random rn = new Random(); 
     int xnum = rn.nextInt(10)-5; 
     a += xnum; 
     System.out.println("x:" + a); 
     return a; 
    } 
    public static int Gety(int b, JFrame frame){ 
     Random rn = new Random(); 
     int ynum = rn.nextInt(10)-5; 
     b += ynum; 
     System.out.println("y:" + b); 
     return b; 
    } 
} 

public static void main(String[] args) { 
    JFrame game = new JFrame(); 
    game.setTitle("Matrix"); 
    game.setSize(500, 500);; 
    game.getContentPane().setBackground(Color.white); 
    game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    game.setVisible(true); 
    CharMove char1 = new CharMove(); 
    CharMove char2 = new CharMove(); 
    game.add(char1); 
    game.add(char2); 
    char1.movement(game); 
    char2.movement(game) 
} 
+0

不起作用。廣場現在一點也不動。它只在創建類的一個實例時起作用,但在我引入第二個時不起作用。 – Ninjaman494

+0

我有一個錯字,它應該是CharMove.Getx和CharMove.Gety。我已經在上面糾正了它。那麼當你打電話給第二個廣場時會發生什麼? –

+0

只有一個方塊出現,並且它不移動,如果我嘗試只添加1個方塊(game.add),購買它與1個方塊一起工作的兩個移動,但另一個不會出現 – Ninjaman494