Java2D-Komponenten

Status
Nicht offen für weitere Antworten.
R

roman63

Gast
Ich möchte folgendes machen:

Zwischen 2 Kreis-Figuren soll eine Verbindung gezeichnet werden. Sowohl die Kreis-Figuren als auch die Verbindungslinie stehen stellvertretend für Objekte, die eben ein paar Attribute haben. So könnte man (oder mann sollte können) mit einem Doppelklick auf den Kreis ein Dialog anzeigen, in dem die für das durch den Kreis dargestellte Objekt relevanten Informationen angezeigt werden. Das gleiche soll auch mit der Verbindungslinie möglich sein.

Beispiel:
Ein Geschäftsauto wird für 3 Aufträge gebraucht. Das Geschäftsauto-Objekt wird in der Mitte als ein Kreis dargestellt, während die drei Auftrag-Kreise um den Geschäftsauto-Kreis angeordnet werden. Jeder Auftrag-Kreis wird mit dem Geschäftsauto-Kreis verbunden, wobei die jeweilige Verbindung beispielsweise die Informationen darüber enthalten könnte, wann und wie Lange das Gäscheftsauto für den konkreten Auftrag eingesetzt wurde. Mit einem Doppelklick auf eine solche Verbindung könnte man diese Informationen in einem Dialog anzeigen lassen. Das gleiche gilt auch für den Geschäftsauto-Kreis und die Auftrag-Kreise.

Wie könnte so was realisiert werden? Könnte man die Kreis-Figuren und die Verbindungslinien als Komponenten definieren und zeichnen? Denn, mit einem Doppelklick auf eine Komponente könnte man das Anzeigen eines Dialogs initieren, würde ich meinen. Und, wie könnte man am einfachsten solche "Komponenten" in einem JPanel zeichnen lassen?

Danke.
 

Marco13

Top Contributor
"Komponenten" im Sinne von Components sollten das wohl nicht sein. Abgesehen davon, dass man für einen Kreis nur Mittelpunkt+Radius braucht, und bei einer Component SEHR viele überflüssige Informationen dabei sind, bringt dir die Component spätestens bei der Linie auch nichts mehr: Ob die Linie durch einen Klick getroffen wurde, musst du so oder so "per Hand" ausrechnen.

Je nachdem, wie allgemein das ganze sein soll, gäbe es da verschiedene mögliche Ansätze. Auf Basis der wenigen Informationen, die du bisher gegeben hast, wäre sowas vielleicht denkbar...
Code:
interface Item
{
    public void draw(Graphics g); // Zum zeichnen

    public boolean isHitByClick(Point position); // Zum prüfen, ob das Objekt von einem Klick getroffen wird

    public String (???) getInformation(); // Liefert das, was im Dialog angezeigt wird (Könnte ggf. auch eine eigene Klasse "ItemInformation" sein!!!)
}

class CircleItem implements Item
{
    private Point center;
    private int radius;

...
    public void draw(Graphics g) { g.drawOval(...); }

    public boolean isHitByClick(Point position) { return (abstand zwischen center und position ist < radius); }
}

class LineItem implements Item
{
    private Point point0;
    private Point point1;

    public void draw(Graphics g) { g.drawLine(...); }

    public boolean isHitByClick(Point position) { return (abstand zwischen position Line(Point0,Point1) ist "klein"); }
}
Aber die genaue Implementierung ... musst du dir ausdenken :wink:
 
R

roman63

Gast
Heisst, dass ich laufend die Position des Maus-Zeigers scannen muss und entsprechend reagieren, wenn sich der Mauszeiger in der Nähe eines Kreies / einer Linie befindet. Und, gerade dem wollte ich eben ausweichen :( . Ich hoffe, dass die laufende Berechnung von Abständen einigermassen funktionieren wird und nicht allzuviele Ressorcen beanspruchen wird.

Vielen Dank und Gruss.
 

Marco13

Top Contributor
Nun, was heißt "scannen"... Man verwendet einen MouseMotionListener, und in der mouseMoved-Methode macht man die Abstandsberechnung. Bei ein paar Linien und kreisen ist das noch unproblematisch. Wenn es "viele" (vielleicht > 1000) Kreise und Linien werden, kann das schon langsam werden, aber dann muss man sich eben was überlegen, um es schneller zu kriegen... (Besser wäre natürlich, einen MouseListener zu verwenden, und die Berechnungen nur bei mouseClicked zu machen) Wenn man "viele" (>1000) Components hätte, wäre das noch weitaus schlimmer - was sollte man dann machen :? an jede Component einen MouseMotionListener hängen :?
 

roli_07

Mitglied
Nun, das ist es eben. Meine "Veranschaulichung" mittels Geschäftsauto und Auftrag ist eine starke Vereinfachung. Die Anzahl von Figuren ist nach oben "nicht begrenzt". Des Weiteren muss ich auch Tooltips implementieren. Heisst, sobald ich über eine Linie oder eine andere Figur fahre, muss nach kurzer Zeit was angezegt werden. Darum reicht eben mouseClicked nicht. Und, wenn ich viele Linien habe, die in der Mitte zu einem Punkt alle "konvergieren", wird das Unterscheiden zwischen einzelnen Linien nicht mehr so einfach.

Die Abstandberechnung ist an sich kein Problem. Jedoch muss beispielsweise berücksichtigt werden, dass die Gerade "unendlich" lang ist. Da ich eher mit "Strecken" arbeite, muss ich auch immer abfragen, ob die Strecke weiter geht oder nicht. Sonnst berechne ich den Abstand auch dann, wenn ich mich im Bereich befinde, in dem die Strecke gar nicht witer geht.

Also, das sind meine Probleme. Wenn ich viele "Elemente" habe und dies alles "on the fly" berechnet werden muss, könnte es kritisch werden.

Danke und Grusss
 

Marco13

Top Contributor
Nun, egal wie viele Objekte (Linien/Kreise) du hast: Wenn diese Objekte zusätzlich noch den ganzen Ballast mit sich rumschleppen würden, der mit einer "Component" verbunden ist, wäre es vmtl. in jedem Fall deutlich langsamer, und mit Sicherheit EXTREM viel Speicher-fressender. Dass es um Strecken (und nicht um Geraden) geht, hattest du schon deutlich gesagt, aber das ist egal: Das wird ja alles vollkommen transparent in der "isHitByClick(Point position);"-Methode gemacht (die dann aber vielleicht "isHitByMouse(Point position);" heißen sollte :? ).

Mit den ToolTips hättest du mit Components vermutlich (!) sowieso ein Problem.... ein bißchen ASCIII-Art:
Code:
 ___________
|   ____    |
|  /    \   |
| /   ___\ _|_____
||   |\   | |     |
| \  |  \ / |     |
|  \_|__/ \X|     |
|____|______\     |
     |        \   |
     |          \ |
     |____________\
Dort, wo das X ist, würde die Component mit dem Kreis im Vordergrund liegen, aber das X liegt näher an der Linie - es gibt kaum eine vernünftige Möglichkeit, dort "rauszufinden" (oder auch zu beeinflussen) von welcher Comonent das ToolTip stammen soll, das dort angzeigt wird....
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
lumo Java2D oder doch OpenglES Spiele- und Multimedia-Programmierung 4
windl CoverFlow in Java2D erstellt Spiele- und Multimedia-Programmierung 24
Kr0e Java2D - Was ist die bewährte Rendermethode ? Spiele- und Multimedia-Programmierung 2
E Wie rendert Java2D/AWT BufferedImages Spiele- und Multimedia-Programmierung 9
M Realisierung einer Sichtweise in Java2D Spiele- und Multimedia-Programmierung 3
S Java2D: AffineTransformation - KOS Spiegeln Spiele- und Multimedia-Programmierung 5
T Transformationen in Java2D Spiele- und Multimedia-Programmierung 6
B Texte in Java2d Spiele- und Multimedia-Programmierung 4
K Hardwarebeschleunigung für Java2D Spiele- und Multimedia-Programmierung 9
A Java2D Spiel "JSlotter" Spiele- und Multimedia-Programmierung 3
B Java2D: Gradientpaint Spiele- und Multimedia-Programmierung 2
H mit Java2D Markierung über JTable zeichnen und diese bewegen Spiele- und Multimedia-Programmierung 2
M Java2D: GradientPaint mit mehreren Farben Spiele- und Multimedia-Programmierung 4
T Java2D Spiel, beim Hinzufügen eines Bildes ruckelt das ganze Spiele- und Multimedia-Programmierung 3
G SNES Mode7 mit Java2D? Spiele- und Multimedia-Programmierung 2
C Java2D Darstellungsfehler Spiele- und Multimedia-Programmierung 2
C OpenGl Support für Applet (sun.java2d.opengl=True) Spiele- und Multimedia-Programmierung 3
S [Java2D] Performance Frage Spiele- und Multimedia-Programmierung 4
V Java2D dynamische Kurven Spiele- und Multimedia-Programmierung 3
G Punkte des Kreises ausgeben (Java2D) Spiele- und Multimedia-Programmierung 4
K Java2d Bild als JPG oder so speichern Spiele- und Multimedia-Programmierung 10
A Swing Komponenten aktiv neuzeichnen Spiele- und Multimedia-Programmierung 2
X Spiel mit Swing-Komponenten rendern Spiele- und Multimedia-Programmierung 11
aze Java 3d Objekte überdecken 2d Komponenten Spiele- und Multimedia-Programmierung 7

Ähnliche Java Themen


Oben