2017-08-19 3 views
0

Je suis un débutant quand il s'agit de Java et j'essaie de trouver un moyen de voir si un objet est situé sur certaines coordonnées. J'ai essayé de chercher des questions similaires, mais je n'ai toujours pas trouvé de réponse.Comment trouver un objet sur certaines coordonnées en Java

Le programme sur lequel je travaille est une carte (fichier image) et l'utilisateur devrait être capable de créer des lieux et de les placer sur la carte (qui sera affichée sous forme de triangles sur la carte). Il y a aussi cette fonction où l'utilisateur devrait être capable de taper des coordonnées pour voir s'il y a déjà une place sur ces coordonnées.

L'objet est un objet de la classe "Place" et se compose d'un nom, d'une coordonnée x et d'une coordonnée y.

Voici mon code:

class CoordinatesListener implements ActionListener { 

    public void actionPerformed(ActionEvent ave) { 

     try { 
      CoordinatesForm c = new CoordinatesForm(); 
      int answer = c.getAnswer(); 

      if (answer != JOptionPane.OK_OPTION) { 
       return; 
      } 
      if (c.getPosition() == null) { 
       JOptionPane.showMessageDialog(null, "Invalid Input kkk", "Invalid Input", JOptionPane.ERROR_MESSAGE); 
      } else { 
       Position p = c.getPosition(); 
       boolean flag = false; 
       for (Position key : positionList.keySet()) { 
        if (key.getXCoordinate() == p.getXCoordinate() && key.getYCoordinate() == p.getYCoordinate()) { 
         flag = true; 
         this.setAllMarkedPlacesUnMarked(); 
         Place place = positionList.get(key); 
         if (place != null) { 
          System.out.println("the place " + place + "against position " + key); 
          place.setMarked(true); 
          if (!place.isVisible()) { 
           place.setVisible(true); 
          } 
          markedPlacesHashMap.put(place.getName(), place); 
          if (markedPlacesHashMap.containsKey(place.getName())) { 
           markedPlacesHashMap.get(place.getName()).add(place); 
          } else { 
           // ArrayList<Place> newMarkedPlaces = new ArrayList<>(); 
           // newMarkedPlaces.add(place); 
           markedPlacesHashMap.put(place.getName(), place); 
          } 
         } 
        } 
       } 

En outre, quand un lieu est créé, l'utilisateur ne devrait pas être en mesure de placer un autre endroit sur les mêmes coordonnées. Il devrait y avoir un message d'erreur indiquant qu'une place existe déjà sur ces coordonnées.

Voici le code où un lieu est créé:

private void createNamedPlace(int x, int y, String answer) { 
    Position pos = new Position(x, y); 
    display.add(n = new NamedPlace(selectedCategory, pos, answer)); 
    p = n; 
    places = new ArrayList<>(); 
    placeByCategory = new ArrayList<>(); 

positionList.put(pos, n); 

    if (categoryMap.containsKey(selectedCategory)) { 
     categoryMap.get(selectedCategory).add(n); 
     if (nameList.containsKey(answer)) { 
      nameList.get(answer).add(n); 
     } else { 
      places.add(n); 
      nameList.put(answer, places); 
     } 
    } else { 
     placeByCategory.add(n); 
     categoryMap.put(selectedCategory, placeByCategory); 
     if (nameList.containsKey(answer)) { 
      nameList.get(answer).add(n); 
      System.out.println("The new Place have been added in the Name 
      List, the place name is :" + answer); 
      this.displayMap(nameList, " PlACES LIST BY NAME"); 
     } else { 
      places.add(n); 
      nameList.put(answer, places); 
this.displayMap(nameList, "PLACES LIST BY NAME"); 
     } 
     this.displayMap(categoryMap, " PlACES LIST BY CATEGORY"); 
    } 
    n.addMouseListener(new TriangleListener()); 
    display.validate(); 
    display.repaint(); 
    display.removeMouseListener(mouseListener); 
    display.setCursor(Cursor.getDefaultCursor()); 
    newButton.setEnabled(true); 
    categoryList.clearSelection(); 
    isSaved = false; 
} 
+0

"ne fonctionne pas" n'est pas une description de problème que nous pouvons vous aider. Lisez [mcve] et améliorez votre question. Ensuite: évitez de faire autant de choses dans un écouteur. Tu ferais mieux de créer des classes/méthodes auxiliaires. – GhostCat

+0

Essayez de créer un exemple simple pour reproduire le problème, sans tous ces autres codes (potentiellement non liés). Créer un exemple minimal pour reproduire le problème permet aux autres de vous aider plus facilement à résoudre le problème, mais c'est aussi une étape utile dans votre propre débogage: vous pouvez trouver que l'erreur est évidente lorsque vous avez un exemple plus simple . – nbrooks

Répondre

0

Tous les composants Swing sont finalement dérivées de la classe Component, qui a une méthode getBounds(), retour d'un rectangle. Ainsi, vous pouvez simplement écrire quelque chose comme

if (myComponent.getBounds().contains(x,y)) { 
    // do something 

x et y sont les coordonnées du point que vous essayez de vérifier.