2015-10-14 68 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