Kante und PopupMenu

Moin,

ich habe einen Graphen mit Kanten und Knoten. Die Kanten und Knoten sind eigene Komponten. Ich versuche, dass beim Klicken einer Kante ein PopupMenü erscheint, habe aber ein Problem mit setBounds, weil damit nur Rechtecke gesetzt werden können, Kanten aber auch schräg verlaufen können. Ein Freund meinte, ich solle es mal mit javax.media.j3d.BoundingBox probieren. Aber ich weiß erstens nicht wie und zweitens nicht wo ich das herkriege und wie ich das zu meiner Javaversion hinzufüge. Wer hat Tipps für mich?

Gruß, Cosmo

Moin

Ich versuche, dass beim Klicken
einer Kante ein PopupMenü erscheint, habe aber ein Problem mit
setBounds, weil damit nur Rechtecke gesetzt werden können, (…)

Sowas macht man anders:

Schreib einen Mouselistener. In dem testest du 2 Bedingungen:

  1. Kann der Klick ein popup-menü auslösen ?
  2. Ist das auf einer Kante/Knoten/… ?

Damit hast du auch gleich raus welches Element es ist. Das Menü kann man von Hand an der entsprechenden Stelle plazieren und anzeigen/auslösen.

viel Spass.

cu

Moin pumpkin,

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).

Gruß, Cosmo

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

Danke, so in der Art werde ich das machen.

Gruß, Cosmo