2015-10-14 6 views
-1

J'essaie de créer plusieurs caractères (carrés) sur l'écran qui se déplacent de manière aléatoire. J'ai déjà créé une classe CharMove qui crée un carré et le déplace au hasard sur l'écran. Cependant, j'ai essayé de créer plusieurs instances de cette classe dans un fichier java séparé et une seule instance a été créée. Qu'est-ce qui ne va pas?Impossible de créer plusieurs instances d'une classe en Java

CharMove Classe:

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; 
    } 
} 

World Class

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

Où est l'erreur? Quelle est l'attente de production? Qu'est-ce que "ne fonctionne pas"? –

+1

Je suppose que le problème est que vous ne vouliez pas réellement rendre x et y statiques. Supprimer "statique" et il fonctionnera comme vous l'attendez. – Arsen

+0

Le problème est qu'un seul carré s'affiche, donc une seule instance est en cours de création ou deux instances identiques sont en cours de création. La sortie attendue est deux carrés qui se déplacent de manière aléatoire autour de l'écran. – Ninjaman494

Répondre

2

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

Non, vous créez plusieurs instances. Cependant, cela ne fait aucune différence car vous n'avez aucun état par instance. Vos seuls champs sont les suivants:

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

Ce sont champs statiques, ce qui signifie qu'ils ne sont pas liés à une instance spécifique de la classe. Vous voulez probablement supprimer le mot clé static des déclarations. (Je rends également les champs privés et fournissons des getters/setters publics si nécessaire, mais c'est une question différente.)

Vous devrez également faire de vos méthodes statiques dans des méthodes d'instance - parce qu'elles sont censées agir sur des instances individuelles, non? Fondamentalement, je pense que vous devriez réviser la signification de static via n'importe quel livre/tutoriel que vous utilisez pour apprendre Java. (Réviser également les conventions de nommage Java.)

+0

+1 pour les conventions de dénomination Java. Le formatage du code bien (avec le style de code qui vous convient le mieux) aide généralement également. – brimborium

+0

Si je supprime statique de la x et y, je crée l'erreur de compilation: "Impossible de faire une référence statique au champ non-statique CharMove.x" – Ninjaman494

+1

@ Ninjaman44: Ensuite, vous devez corriger cela aussi. Fondamentalement, vous voulez opérer sur des instances ... Vous devriez revoir * tout * votre code à la lumière de ce changement. –

0

Vous ne devriez pas utiliser public static void movement() car il n'est pas méthode d'instance (bien le nom dit, il est statique). En fait, votre code ne devrait pas pouvoir être compilé à char1.movement(100,100,game);. Devrait le déclarer comme méthode d'instance public void movement() à la place. En fait, pour le reste de la méthode, vous voudrez peut-être faire de même. Travail statique sans instance de la classe.

+3

Le code devrait être capable de compiler, parce que Java vous permet d'accéder membres statiques via des instances. Ça craint l'OMI, mais c'est ce que dit le JLS ... –

+0

Pourquoi ne devrait-il pas compiler? Vous pouvez appeler des méthodes statiques en utilisant des instances. Je n'ai jamais compris pourquoi, cependant. :) – brimborium

+0

Oh, ne l'essayez jamais mais bon à savoir. Je vous remercie! – smurf

0

Vos x et y ne sont pas des variables d'instance, ce sont des variables statiques. Ainsi, chaque instance de CharMove partage le même x et y

Essayez ce,

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; 
    } 
} 

et

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

ne fonctionne pas. Le carré ne bouge plus du tout maintenant. Cela fonctionne quand une seule instance de la classe est créée mais pas quand j'en présente une deuxième. – Ninjaman494

+0

J'ai eu une faute de frappe, ça devrait être CharMove.Getx, et CharMove.Gety. Je l'ai corrigé ci-dessus. Alors, que se passe-t-il lorsque vous appelez le deuxième carré? –

+0

Un seul carré apparaît, et il ne bouge pas, si j'essaye seulement d'ajouter 1 carré (game.add) acheter deux mouvements cela fonctionne avec 1 carré, mais l'autre n'apparaît pas – Ninjaman494