2017-06-11 1 views
0

J'ai ce code, j'essaye d'ajouter un MouseListener à un tableau 2D de JTextFields. Je reçois un NullPointerException et je ne suis pas sûr d'où je me trompe. Voici quelques variables que j'utilise.Obtenir l'erreur en essayant d'ajouter un écouteur à un tableau de JTextFields

private int totalX = 20; 
private int totalY = 20; 

private JTextField[][] fields; 
fields = new JTextField[totalX][totalY]; 

for (y = 0; y < totalY; y++) { 
    for (x = 0; x < totalX; x++) { 
     fields[x][y].addMouseListener(this); 
     new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       for (y = 0; y < totalY; y++) { 
        for (x = 0; x < totalX; x++) { 
         if (fields[x][y].hasFocus()) { 
          if (value == null) { 
           value = "W"; 
          } else { 
           fields[x][y].setText(value); 
          } 
         } 
        } 
       } 
       Draw(); 
      } 
     }; 
    } 
} 
+1

pourriez-vous ajouter l'erreur de pile complète s'il vous plaît? aussi le code complet de classe aiderait –

+0

@DamianLattenero Je suis assez nouveau au codage, où je peux obtenir l'erreur pleine pile? Le code ci-dessus, je le mets sous 'private void run()' et pas dans une classe séparée. – Nicz

+0

Le vous juste ajoutez une petite partie de l'erreur de pile, la partie qui a dit NullPointerException, le reste du texte, est la pile entière :), de toute façon, un utilisateur a détecté votre erreur, vérifiez la réponse, et n'oubliez pas accepter si cela a fonctionné (accepter avec la case à cocher en haut à gauche dans la réponse) –

Répondre

2

Vous devez initialiser tous les éléments du tableau avant d'utiliser les amener cette ligne crée un tableau avec nulls intérieur

fields = new JTextField[totalX][totalY]; 

donc créer un nouvel élément de tableau à l'avance

fields[x][y] = new JTextField(); 
fields[x][y].addMouseListener(this); 

BTW votre code semble un peu bizarre, vous créez un nouveau MouseAdapter() mais ne l'utilisez pas. Donc, ce sera la collecte des ordures.

Mise à jour: Vous devez mettre votre new MouseAdapter() comme paramètre pour addMouseListener() méthode

fields[x][y].addMouseListener(new MouseAdapter() { 
    @Override 
    public void mousePressed(MouseEvent e) { 
     ... Put your code here ... 
    }); 
+0

Ajout de cette ligne 'fields [x] [y] = new JTextField();' arrête l'application de plantage, mais j'ai essayé de tester si elle écoute réellement actions de la souris en utilisant 'System.err.println (" Test ");' mais il n'y a pas de sortie. – Nicz

+0

@Nicz Votre code posté ne peut pas fonctionner parce que vous créez mais n'utilisez pas l'objet MouseAdapter –

+0

Hate est un problème, mais pourriez-vous me donner un exemple sur la façon de le faire? J'apprends toujours à coder, donc je n'en ai pas beaucoup. – Nicz

0

Je pense qu'il ya une idée fausse sur la façon dont fonctionne une classe interne anonyme, également la façon dont le mot clé this fonctionne réellement.

Dans votre code, vous dites:

fields[x][y].addMouseListener(this); 

en passant dans le mot this dans cette méthode, vous passez dans l'objet courant que vous êtes dans la classe Ce qui signifie que courant lui-même est un. MouseListener, qui est-il implements l'interface MouseListener et dans cette classe que vous avez mis en œuvre toutes les 5 méthodes définies par MouseListener OU la classe actuelle étend la classe abstraite appelée MouseAdapter (qui elle-même met également en œuvre MouseListener)

donc, dans votre code, tu as un objet MouseAdapter (défini comme une classe interne) qui est tout à fait ballants et ne sert à rien puisque son utilisation partout:

new MouseAdapter() { 
        @Override 
        public void mousePressed(MouseEvent e) { 
         for (y = 0; y < totalY; y++) { 
          for (x = 0; x < totalX; x++) { 
           if (fields[x][y].hasFocus()) { 
            if (value == null) { 
             value = "W"; 
            } else { 
             fields[x][y].setText(value); 
            } 
           } 
          } 
         } 
         Draw(); 
        } 
       }; 

donc des solutions pourrait être:

  1. Remplacer le mot-clé this avec la nouvelle objet u've créé comme ceci:

    champs [x] [y] .addMouseListener (nouveau MouseAdapter() {

    @Override 
        public void mousePressed(MouseEvent e){ 
    

    // tout le code implementatiin ici

    }}
    ); Faites en sorte que votre classe actuelle implémente MouseListner et implémente toutes les méthodes ou seulement celles que vous voulez utiliser.