Moin
hmmm, vielleicht hast du mich missverstanden. Ich versuch’s mal
mit’m Beispiel: Angenommen ich habe eine Kante von (0,0) nach
(10,10). Dann reagiert diese Kante beispielsweise auch bei einem
Klick auf (2,9), oder irgendeinem anderen Punkt im Reckteck
(0,0), (0,10), (10,10), (10,0).
Doch, so hab ich das auch verstanden, Beispiel:
Du hast (der einfachheit halber) eine JPane/Pane in der alle Kanten/Knoten drin sind. Du hast eine Liste alle Kanten/Knoten und deren Positionen realtiv zur Pane. Du kannst irgendwie feststellen zu welcher Kante die Koordinaten X,Y eines Klicks gehören.
Jetzt schreibst du einen normalen Mouselistener der auf alles (alle Knoten, alle Kanten und die Pane) reagiert was auch nur in der Nähe von Kanten oder Knoten sein könnte. In desen mouseClicked(MouseEvent e)-methode kannst du rausfinden worauf geklickt wurde (e.getSource()). Ist es die Pane so benutzt du die Koordinaten (e.getX(), e.getY()) direkt um nach der richtigen Kante/Knoten zu suchen. Ist es ein Knoten/Kante so muss du die event-koordinaten realtiv zur Pane rausbekommen (((Component)e.getSource()).getX() + e.getX()) und dann mit diesen suchen. Mit ein bisschen Glück kann man die Suche in O(log(n)) hinbekommen, viel schneller ist java selbst auch nicht.
Wenn man dann raus hat was gemeint war kann man das Popup ja entsprechend auftauchen lassen.
Wenn man java die Entscheidung überlässt ist spätestens bei Überkreuzungen/Überlappungen von Kanten Schluss. Oder um dein Bespiel aufzugreifen: was ist den mit (-0.1,-0.1) ? java wird das niemals als Hit auf die Kante werten, aber in deinem such-code kannst du das abfangen.
Wenn man sicher ist dass niemals 2 Knoten oder Kanten überlappend dargestellt werden können gibts noch einen zweiten Weg: Man schreibt einen PopupMenuListener und fragt in popupMenuWillBecomeVisible ab ob die Koordinaten des Klicks OK sind. Das ist allerdings murks, weil man da keine saubere Möglichkeit zum Abbruch des Popups hat.
cu