![]() |
| | Themen-Optionen | Thema durchsuchen |
| | Nach oben #1 |
| Gast
Beiträge: n/a
|
Hi Forum, ich habe nun auch mal angefangen, mich ein bisschen mit Java zu beschäftigen. Nun möchte ich einfach einmal ein kleines Progrämmchen schreiben, mit dem ich auf ein Canvas Objekt mittels Maus (Events) eine Linie zeichen kann. Leider fehlt mir ein bisschen der Faden. Bisher habe ich mir eine Klasse "Leinwand" erstellt, die Canvas erweitert und mir eben jenes Zeichenfeld erstellt. Momentan habe ich keine Ahnung, wie ich nun am besten vorgehe, um einen MouseListener bzw. einen MouseMotionListener dazu zu bringen mir Linien zu Zeichnen :-). Vielleicht kann mir jemand mal den grundsätzlichen Weg skizzieren. Eventuell reicht mir auch schon eine Seite mit einigen Codeschnipseln - das wäre natürlich genial. liebe Grüsse Andi |
|
| | Nach oben #2 |
| Chefkoch-Mod Registriert seit: 30.05.2004
Beiträge: 432
|
Hi, ich habe selber noch keine Zeichenprogramme implementiert. Möchtest Du gerade Lininen durch zweifaches Klicken erzeugen? Oder freies Zeichnen? Nun ja, Du kannst Deiner Komponente K einen MouseAdapter Code: k.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent evt) {
//Start Zeichnen
}//mouseClicked(MouseEvent evt)
public void mouseReleased(MouseEvent evt) {
//Ende Zeichnen
}
});
Das MouseEvent hant Methoden, welche Dir den aktuellen Punkt zurückgeben. Dasselbe kannst Du auch mit einem MouseMotionAdapter machen. Du musst nur die Methoden füllen. Ich persönlich arbeite lieber mit Adaptern, da man diese "Klassen" in der Methode selber implementieren kann und keine extra interne (oder externe) Klasse erzeugen muss.
__________________ Denk mal darüber nach... Lars ACHTUNG: wenn ich von Klassen spreche, könnte ich auch deren Instanzen meinen. www.linuxforen.de +++ www.macuser.de +++ www.mrunix.de +++ www.lmprojects.de |
| | |
| | Nach oben #3 |
| Gast
Beiträge: n/a
|
Hallo Sym, vielen Dank für deine Mühe, mein (Verständnis-)Problem liegt eher daran, dass wenn ich nun auf ein MouseEvent reagiere z.B. MousePressed und dann die Linie zeichnen möchte, ich ja die Endpunkte noch nicht kenne. Anderstherum, reagiere ich auf das MouseEvent MouseReleased, kenn ich doch für DrawLine die Anfangspunkte nicht ..... Dieses Problem beschäftigt mich... wobei ich da warscheinlich nur noch ganz falsch denke (imperativ) und an die Sache herangehe ... |
|
| | Nach oben #4 |
| Chefkoch-Mod Registriert seit: 30.05.2004
Beiträge: 432
|
Hallo, ach so. Du könntest das doch über mouseClicked lösen. Beim ersten Klick speicherst Du die Koordinaten (durch das MouseEvent) und beim zweiten Klick auch. Dann zeichnest Du eine Linie zwischen beiden Punkten. Alternativ implementierst Du mousePressed indem Du vorher die Variablen mit einem Negativen Wert festsetzt und diesen Wert in der Methode nur änderst, wenn die Werte negativ sind. Das hat zur Folge, dass bei MousePressed nur der erste Klick gespeichert wird. Den Endpunkt erhälst Du durch die mouseReleased Methode (dort kannst Du den Startwert auch wieder neg. setzen). Somit kannst Du dann die nächste Gerade wieder zeichnen.
__________________ Denk mal darüber nach... Lars ACHTUNG: wenn ich von Klassen spreche, könnte ich auch deren Instanzen meinen. www.linuxforen.de +++ www.macuser.de +++ www.mrunix.de +++ www.lmprojects.de |
| | |
| | Nach oben #5 |
| Neuer Benutzer Registriert seit: 27.05.2004
Beiträge: 25
|
Mein Vorschlag: Bei mouseclicked die Linie anfangen und zur aktuellen Mausposition zeichnen (mousemoved, getX, getY). MfG Bischi PS: Natürlich die jeweils zuvor gezeichnete Linie wieder löschen - indem du sie beispielsweise mit weiss übermalst (oder sonst ganzes Bild neu zeichnen, dann aber doppelbufferung verwenden). Natürlich bei einem weiteren Klick die Linie zu Ende Zeichen... |
| | |
| | Nach oben #6 | |
| Erfahrener Benutzer Registriert seit: 29.05.2004
Beiträge: 228
|
[OT] Zitat:
Der grosse Unterschied ist, dass du beim Listener sämtliche Methoden implementieren musst (allenfalls auch leer) und beim Adapter sind die schon leer und du überschreibst nur die welche du brauchst. Codemässig kannst du aber auch Listener einfach als anonyme innere Klasse implementieren. [/OT] MfG Peschmä
__________________ Amazon.de | The Java Trap | Freie Software | Freie Software vs. Open Source | GNU Classpath | GCJ | SableVM "We should forget about small efficiencies, say about 97% of the time: Premature optimization is the root of all evil." - Donald Knuth | |
| | |
| | Nach oben #7 | ||
| Chefkoch-Mod Registriert seit: 30.05.2004
Beiträge: 432
| Zitat:
__________________ Denk mal darüber nach... Lars ACHTUNG: wenn ich von Klassen spreche, könnte ich auch deren Instanzen meinen. www.linuxforen.de +++ www.macuser.de +++ www.mrunix.de +++ www.lmprojects.de | ||
| | |
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | Thema durchsuchen |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| SessionID per Url auf Portal-Seite | Artemis | Fragen ans Team | 7 | 09.07.2007 20:25 |
| Apache-Zugriffskontrolle auf eine Datei per .htaccess: 500er | Artemis | Tools, Server, Betriebssysteme | 4 | 23.03.2007 21:29 |
| Line2D.Double-Objekt auf Panel zeichnen - kein Graphics-Objekt vorhanden :-/ | Ben | Desktop-Applikationen und Grafik | 10 | 02.03.2006 15:34 |
| Textfelder auf verschiedenen Tabs per Observer synchronisieren | Sayang | Desktop-Applikationen und Grafik | 2 | 05.12.2005 19:14 |
| [PHP] Wie übergebe ich Daten per URL? | Ben | Tutorials | 0 | 05.12.2004 14:36 |