Gezeichnete Java2D Elemente mit Events versehen

Status
Nicht offen für weitere Antworten.

MrMilti

Mitglied
Hallo miteinander,

ich habe derzeit ein sehr extravagantes Problem, bei dem ich auf keine Lösung mehr komme. Ich zeichne eine Menge Elemente mit Java2D in eine von JPanel abgeleitete Klasse. Das ansich funktioniert so wie es soll, jetzt möchte ich aber diese gezeichneten Elemente mit Events verknüpfen, sprich dass eine Funktion ausgeführt wird, wenn man z.B. eine Linie anklickt.

Ich hab es mit einem eigenen MouseListener versucht, da kennt sich aber nicht einmal der Compiler aus:

Java:
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;


public class netEDIT extends JApplet
	{
	JDrawPanel zeichenpanel = new JDrawPanel();

	public void init ()
		{
		add(zeichenpanel);
		}

	class JDrawPanel extends JPanel
		{
		private Graphics2D g2;

		JDrawPanel()
			{
			setBackground(Color.WHITE);
			}

		public void paintComponent(Graphics g)
			{
			super.paintComponent(g);
			g2 = (Graphics2D) g;

			Line2D.Double Linie = new Line2D.Double(50,50,100,100);
			Linie.addMouseListener(new MyMouseListener());
			g2.draw(Linie);
			}
		}

	class MyMouseListener implements MouseListener
		{
		public void mouseExited (MouseEvent e) {}
		public void mouseEntered (MouseEvent e) {}
		public void mouseReleased (MouseEvent e) {}
		public void mousePressed (MouseEvent e) {}
		public void mouseClicked (MouseEvent e) {showStatus("blubb");}
		}
	}
Hier nur mal in der absurd-Variante, die bei click einfach nur "blubb" in die Statuszeile schreibt, damit man sehen kann, ob die Funktion überhaupt ausgeführt wird. Mach ich gerne so, bevor ich mir groß um den Aufbau dieser Funktion den Kopf zerbreche. Außerdem ist das eine extrem gekürzte Fassung meines Applets, grade um meine Problemstellung zu beschreiben.

jedoch die Meldung des Compilers:
Code:
source/netEDIT.java:861: cannot find symbol
symbol  : method addMouseListener(netEDIT.MyMouseListener)
location: class java.awt.geom.Line2D.Double
					Linie.addMouseListener(new MyMouseListener());
					     ^
1 error

Funktioniert sowas grundsätzlich nicht, oder mach ich hier irgendwas falsch?

Und falls das nicht möglich ist, wie könnte man es noch lösen?

  • Könnte man die Linie beispielsweise in einen Container ablegen und das Signal von diesem auslösen? Müssten dann aber unendlich viele Container möglich sein, für meine Anwendung.
  • Ich könnte mir auch vorstellen, einfach einen Klick auf das Panel zu registrieren, bei dem x und y Koordinaten des Mausklicks ausgelesen werden und dann alle Zeichenelemente überprüft, ob diese an besagten Koordinaten liegen. Wär aber unschön, da das mit der wachsenden Anzahl an Zeichenelementen vermutlich etwas langweilig wird.
Problem bei mir ist auch, dass sich mehrere Linien, Kreisbögen, etc überlappen oder kreuzen können, dennoch sollte es möglich sein jedes Element gezielt anzuklicken. Also für eine einzelne Linie eine große rechteckige Fläche zu definieren, die dann auch alle anderen etwaigen dort vorkommenden Grafikelemente überdeckt, wär für mich keine Lösung.


Schonmal danke fürs durchlesen :)
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
Die Klassen des Paketes java.awt.geom sind zum zeichnen gedacht. Die kann man nicht anklicken, Ihnen Fokus geben, sie mit der Maus verschieben, etc. Es handelt sich nicht um AWT-Komponenten (sind also keine java.awt.Component-Derivate) und deshalb kann man ihnen auch nicht die Listener geben, die eine Komponente entgegennehmen kann. Darüber klärt Dich die API-Doc ganz gut auf.

Stell Dir die java.awt.geom.Line2D-Klasse einfach als Rezept zum Zeichnen vor; sie kann nicht viel mehr, als dem Zeichenstift den Weg weisen. So verhält es sich mit allen Formen -- Line2D implementiert wie Rectangle2D, Arc2D, etc. das java.awt.Shape-Interface.

Wenn Du nun also Listener brauchst, so musst Du die Listener auf das Panel setzen das die Formen zeichnet. Dieses Panel muss dann unter den Formen herausfinden, welche nahe am Maus-Zeiger liegt. Ich würde mir also ein Rechteck (Rectangle2D) der Größe 1x1 Pixel um die Mauskoordinaten anlegen und dann jede Form fragen, ob sie dieses Rechteck entweder beinhaltet(contains(Rectangle2D)) oder schneidet (intersects(Rectangle2D)). Theoretisch kann man die Form einfach fragen, ob ein Punkt (Point2D) in ihrem Inneren liegt (contains(Point2D)), allerdings wird das bei Linien schon eher schwierig; daher zusätzlich der Test auf das Rechteck sozusagen als Fangbereich.

Probier's mal aus. Und schau Dir die API-Docs zu den Klassen an; nicht einfach irgendwas hintippen und mal gucken was der Compiler schimpft. :-D

Ebenius
 

Marco13

Top Contributor
Line2D bietet auch Möglichkeiten zur Abstandberechnung, d.h. wenn die Mausposition z.B. 5 Einheiten von der Linie entfernt ist, kann sie als "angeklickt" gelten..
 

MrMilti

Mitglied
Ach, wenn ich etwas nicht auf die schnelle in der API finde, wird gerne mal munter drauf los versucht :toll:

Jedenfalls, hab gleich mal deinen Vorschlag umgesetzt und das funktioniert fabelhaft, herzlichen Dank :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Monokuma 2D-Grafik Imageimport durch eine gezeichnete Form ersetzen AWT, Swing, JavaFX & SWT 16
M Gezeichnete Linine verschwinden AWT, Swing, JavaFX & SWT 7
S Nach scrollen verschwindet das zuvor im JPanel gezeichnete AWT, Swing, JavaFX & SWT 2
propra Auf einem JPanel gezeichnete Linie auswählen AWT, Swing, JavaFX & SWT 3
K Swing JPanel auf gezeichnete Fläche legen AWT, Swing, JavaFX & SWT 4
N gezeichnete Graphiken speichern und wieder anzeigen AWT, Swing, JavaFX & SWT 8
D gezeichnete bilder verblassen AWT, Swing, JavaFX & SWT 10
M Gezeichnete graphic in JTabbedPanel AWT, Swing, JavaFX & SWT 2
A gezeichnete Linie verschwindet, wenn ich JMenuBar öffne AWT, Swing, JavaFX & SWT 2
M gezeichnete Punkte dynamisch verschieben mit mousedragged AWT, Swing, JavaFX & SWT 4
R eine gezeichnete graphik speichern. AWT, Swing, JavaFX & SWT 15
K Java2d mit GLG2D beschleunigen AWT, Swing, JavaFX & SWT 0
J Swing Vertikales Zeichnen eines Strings mit Java2D AWT, Swing, JavaFX & SWT 1
X JInternalFrame vor Java2D-Zeichnung langsam bzw. Gui friert ein AWT, Swing, JavaFX & SWT 1
B Java2D - Zeichenreihenfolge AWT, Swing, JavaFX & SWT 3
M Swing + Java2D Sichtfeld bewegen verhält sich träge AWT, Swing, JavaFX & SWT 4
T Java2D and SVG vs PNG AWT, Swing, JavaFX & SWT 12
S Java2D/Graphics2D in Android..? AWT, Swing, JavaFX & SWT 2
C Java2D Transparenz geht bei einfärben verloren AWT, Swing, JavaFX & SWT 7
K 2D-Grafik Java2D mit Hardware-Unterstützung? AWT, Swing, JavaFX & SWT 5
J Stufenlos vergrösserbare Fonts in Java2D? AWT, Swing, JavaFX & SWT 5
M java2D/jogl interoperability AWT, Swing, JavaFX & SWT 22
J Java2D Kreis/Kurven Frage AWT, Swing, JavaFX & SWT 2
Kr0e Allgemeine Frage zu Java2D (Eigene Impl.) AWT, Swing, JavaFX & SWT 18
S Transformationen in Java2D..? AWT, Swing, JavaFX & SWT 4
D Zeichen ein Pixel mit Java2D AWT, Swing, JavaFX & SWT 15
L Java2D AWT, Swing, JavaFX & SWT 2
K Java2D auf Knopfdruck weiterzeichnen AWT, Swing, JavaFX & SWT 4
M Elemente statisch anordnen AWT, Swing, JavaFX & SWT 4
_user_q ChoiceBox Elemente: Sprache ändern AWT, Swing, JavaFX & SWT 7
T Elemente auf vorheriger Stage, nach Wechsel der Stage ansprechen AWT, Swing, JavaFX & SWT 32
Lunar Swing JFrame erstellt; weitere Elemente werden nicht eingefügt/sind nicht zu sehen AWT, Swing, JavaFX & SWT 4
J JavaFX JavaFX Splitpane - Zugriff auf die Controller der Elemente AWT, Swing, JavaFX & SWT 8
G Swing Variable Elemente für GroupLayout AWT, Swing, JavaFX & SWT 18
F JFrame zeigt nicht alle Elemente auf anhieb an AWT, Swing, JavaFX & SWT 4
J JavaFX Elemente werden nicht zu TableView hinzugefügt AWT, Swing, JavaFX & SWT 3
J JavaFX JavaFX Elemente an Fenstergröße skalieren AWT, Swing, JavaFX & SWT 5
M Schnittpunkte zwischen zwei Graphics2D Elemente ermitteln. AWT, Swing, JavaFX & SWT 5
T LayoutManager Anordnen der Elemente im GridBagLayout AWT, Swing, JavaFX & SWT 11
T AWT Grafik"Array" einzelne Elemente verschieben AWT, Swing, JavaFX & SWT 1
sandaime Swing 3 JComboBoxen ausgelesen Elemente einzel ausgeben AWT, Swing, JavaFX & SWT 6
M JavaFX GUI-Elemente erstellen, nachdem die GUI geladen hat AWT, Swing, JavaFX & SWT 4
TheJavaKid JavaFX Elemente positionieren AWT, Swing, JavaFX & SWT 2
B Swing Auf JList-Elemente aus einer anderen Klasse zugreifen AWT, Swing, JavaFX & SWT 1
N JavaFX GUI Elemente einer anderen (FXML)Klasse ansprechen AWT, Swing, JavaFX & SWT 16
D JavaFX Elemente aus VBox unterscheiden AWT, Swing, JavaFX & SWT 1
K Kann nicht auf GUI Elemente zugreifen, mit einer Methode im Controller klappts, mit der anderen nich AWT, Swing, JavaFX & SWT 10
R Swing Elemente verschieben sich im GBL beim Ein/Ausblenden AWT, Swing, JavaFX & SWT 0
Z Swing Swing: Elemente werden doppel/verschoben gezeichnet, sind teils unsichtbar etc... AWT, Swing, JavaFX & SWT 10
wolfgang63 JavaFX Elemente einer Group entfernen AWT, Swing, JavaFX & SWT 1
D SWT SWT Elemente aus anderen Klassen aufrufen - Invalid thread access AWT, Swing, JavaFX & SWT 6
O Ähnliche GUI Elemente - vererbung?! AWT, Swing, JavaFX & SWT 0
M AWT Gui anzeige Probes - Elemente erscheinen nicht regelmäßig AWT, Swing, JavaFX & SWT 2
M Swing JTabbedPane: Tab-Elemente anpassen AWT, Swing, JavaFX & SWT 3
T Swing Elemente der JList überlappend darstellen AWT, Swing, JavaFX & SWT 5
K GUI Elemente über eine separate Textdatei beschriften? AWT, Swing, JavaFX & SWT 4
T Alle Swing-Elemente anzeigen AWT, Swing, JavaFX & SWT 9
M Swing Elemente im Dialog neu "laden". AWT, Swing, JavaFX & SWT 6
T JTree - Elemente mit Doppelklick auswählen AWT, Swing, JavaFX & SWT 6
L Swing ActionListener zugriff auf bestimmte Elemente AWT, Swing, JavaFX & SWT 3
S Elemente im Panel in richtige Ausgangsstellung bringen AWT, Swing, JavaFX & SWT 10
K LayoutManager Wieso verschwinden Elemente? AWT, Swing, JavaFX & SWT 20
M JFrame + JNA/aero modul - GUI Elemente so möglich? AWT, Swing, JavaFX & SWT 28
P Elemente einer JList ausgeben AWT, Swing, JavaFX & SWT 11
B JList zeigt Elemente nicht an AWT, Swing, JavaFX & SWT 3
R Größe/Anordnung der Gui-Elemente automatisch? AWT, Swing, JavaFX & SWT 6
S JVM von Oracle/Sun soll für AWT/SWING Elemente die die Optimierungen der NVidia Treiber verwenden AWT, Swing, JavaFX & SWT 3
C Swing JFrame nimmt keine anderen Elemente auf AWT, Swing, JavaFX & SWT 13
R JApplet, Elemente unsichtbar AWT, Swing, JavaFX & SWT 2
1 JList - Elemente mit rechter Maustaste wählen AWT, Swing, JavaFX & SWT 6
L ID für GUI Elemente generieren AWT, Swing, JavaFX & SWT 11
C SWT-Elemente an View-Fenster angleichen und automatisch resizen AWT, Swing, JavaFX & SWT 3
U Elemente im Panel zentrieren mit GridLayout AWT, Swing, JavaFX & SWT 3
P Elemente im Kreis aufstellen AWT, Swing, JavaFX & SWT 5
G Swing Elemente aus Arraylist auf JFrame anzeigen AWT, Swing, JavaFX & SWT 9
G GUI Elemente aus NetBeans verwenden AWT, Swing, JavaFX & SWT 8
L SWT tree elemente markieren AWT, Swing, JavaFX & SWT 4
C Swing Elemente in JList sortieren AWT, Swing, JavaFX & SWT 2
T Elemente zu JList dynamisch hinzufügen AWT, Swing, JavaFX & SWT 4
S JTree Elemente nach BaumLevel abspeichern AWT, Swing, JavaFX & SWT 2
S JTree & JComboBox - Elemente übers Fenster hinaus anzeigen AWT, Swing, JavaFX & SWT 9
F JScrollPane überlagert andere Elemente AWT, Swing, JavaFX & SWT 5
S Swing UI-Elemente ordnen sich ungewollt in einer Reihe (ohne Layout) AWT, Swing, JavaFX & SWT 5
K Swing Elemente auf Zeichenfeld verschieben AWT, Swing, JavaFX & SWT 8
S Mit eigener Klasse auf GUI-Elemente zugreifen AWT, Swing, JavaFX & SWT 3
E Swing JComboBox als CellEditor in JTable zeigt Elemente nicht sofort an AWT, Swing, JavaFX & SWT 5
R In JFrame oder in Canvas mit grafischen Elemente zeichnen AWT, Swing, JavaFX & SWT 2
E Swing JList zur Laufzeit hinzugefügt elemente nicht sichtbar?! AWT, Swing, JavaFX & SWT 2
S Swing Elemente einer JList Farbig hinterlegen AWT, Swing, JavaFX & SWT 6
B Swing Dynamisch Elemente in JScrollPane hinzufügen AWT, Swing, JavaFX & SWT 6
M Swing Von einem Controller aus View-Elemente ändern AWT, Swing, JavaFX & SWT 11
T DND mit JList Elemente nicht am Ende einfügen AWT, Swing, JavaFX & SWT 3
Tobse Swing JList elemente hinzufügen AWT, Swing, JavaFX & SWT 4
K JLayeredPane Elemente auf gleicher Position AWT, Swing, JavaFX & SWT 7
D Elemente werden nicht angezeigt AWT, Swing, JavaFX & SWT 2
W jComboBox unterschiedlich selectable elemente AWT, Swing, JavaFX & SWT 7
M Elemente in JTabbedPane platzieren AWT, Swing, JavaFX & SWT 7
N Swing JList Elemente ausgeben fehlerhaft AWT, Swing, JavaFX & SWT 4
M Swing Alle Elemente eines Panels? AWT, Swing, JavaFX & SWT 9
S Eigene GUI Elemente erstellen AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben