# Spezieller Cursor in Swing



## babuschka (26. Apr 2007)

Hallo zusammen,

habe eine Frage zu Cursors mit Swing in Kombination mit Zeichnen mit AWT. Ich initialisiere ein JPanel in Swing und zeichne mit AWT darauf. Jetzt möchte ich einen "besonderen" Cursor in das JPanel rein integrieren, der folgende Eigenschaften haben soll:

- das Cursorsymbol selbst soll die Form einer Raute haben und ca. 64x32 px groß sein.
- der Cursor soll sich nicht "stufenlos", also wie gewohnt immer pixelweise über den Bildschirm gleiten, sondern "diskret", also immer nur "eine Raute neben der anderen" und das in alle Richtungen.

Ich hoffe, ihr versteht, was ich meine. Wenn nicht, dann zeichne ich gerne noch eine kurze Skizze. Wäre nett, wenn mir jemand weiterhelfen könnte.

Vielen Dank und viele Grüße,

squirrel


----------



## Wildcard (26. Apr 2007)

Was meinst du wenn du sagst mit AWT auf Swing zu zeichnen?

Über den Betriebssystem Cursor lässt sich das nicht lösen (alleine schon dadurch das er zum Beispiel auf Windows gar nicht so groß sein darf).
Du müsstest den Cursor unsichtbar machen und alles selbst zeichnen. Dürfte mit Arbeit verbunden sein.


----------



## babuschka (26. Apr 2007)

@Wildcard: okay, danke. Ich hab soetwas schon befürchtet. Vielleicht erzähle ich meine Idee noch mal neu und etwas ausführlicher und kombiniere es mit deiner Aussage "Du müsstest den Cursor unsichtbar machen und alles selbst zeichnen" von eben:

Ich möchte ein kleines Game in Java programmieren, und zwar in isometrischer Darstellung. Dazu habe ich jetzt einen Hintergrund bestehend aus vielen Kacheln, "tiles", die allesamt Rauten der Größe 64x32 px sind.

Nun möchte ich auf diesem "Boden" den eben beschriebenen Cursor drauflegen. Könnte ich nicht eine Art zweiten Layer drüberlegen, bei dem über jeder Kachel genau einmal eine "Auswahlraute" zu sehen ist. Und dann alle Rauten unsichtbar machen und immer nur diejenige Auswahlraute über der jeweiligen Kachel "aufleuchten" lassen, über die der (unsichtbare) Cursor gerade drüberwandert? Das wäre doch dann die Idee von dir, Wildcard, oder?

Gruß,
squirrel


P.S. mit "mit AWT auf Swing zeichnen" meine ich: ich hab mittels javax.swing.JPanel ein JPanel gebastelt, und dann benutze ich u.a. die Methoden paint() und drawOnBackgroundImage() aus java.awt.Graphics um darauf zu zeichnen. Dabei mache ich von double-buffering Gebrauch.


----------



## Wildcard (26. Apr 2007)

Sowas?





Das ist machbar.
Ich hatte mir aus deiner Schilderung etwas wesentlich komplizierteres Vorgestellt.



> P.S. mit "mit AWT auf Swing zeichnen" meine ich: ich hab mittels javax.swing.JPanel ein JPanel gebastelt, und dann benutze ich u.a. die Methoden paint() und drawOnBackgroundImage() aus java.awt.Graphics um darauf zu zeichnen. Dabei mache ich von double-buffering Gebrauch.


Bei JPanel solltest du unbedingt paintComponent überschreiben und nicht paint.
DoubleBuffering brauchst du nicht, das macht Swing alleine und soweit möglich sogar Hardwarebeschleunigt.


----------



## babuschka (27. Apr 2007)

Jaaa!  Ganz ganz genau soetwas! Dieses kleine graue Sechseck in der Mitte möchte ich realisieren. Kannst du mir vielleicht einen Hinweis oder einen Link geben, wie ich da grob vorzugehen habe?

Okay, werde alsbald mal meine paint() Funktionen ersetzen und optimieren, danke für den Hinweis!

Gruß,
squirrel


----------



## Wildcard (27. Apr 2007)

Die Sechsecke haben vermutlich auch eine Relevanz im späteren Spiel, insofern würde ich dir dazu raten sie als eigene Objekte zu implementieren.
Mit einem MouseMotionListener findest du raus über welchem Sechseck der Cursor ist und setzt diesem ein 'isSelected' Flag oder etwas in der Art.
Dieses Flag wird beim Rendern des Sechsecks ausgewertet und schlägt sich in einer Border nieder.
Ist nicht allzu schwierig.
Aber vorher unbedingt das Konzept überlegen. UML Diagramme etc.  :wink:


----------



## babuschka (27. Apr 2007)

Alles klar, das klingt nach einem guten Plan! Ich werde mich sofort an die Arbeit machen! Vielen Dank schonmal für deine Hilfe, Wildcard! Kann ich mich evtl. bei Fragen nochmal melden?

Zur Info: das Spiel wird im Rahmen eines Programmierprojektes an der Uni erstellt und da haben wir ein recht striktes Ablaufmodell des Projektes. Alles ist in Milestones aufgeteilt. Der erste Milestone war, das Konzept, das Klassendesign und das visuelle GUI-Design zu erarbeiten und vorzustellen. Also UML haben wir schon ordentlich gequält... ;-) Nun sitzen wir am 2. Milestone und müssen den Prototypen entwickeln. Meine Aufgabe ist (u.a.) das GUI.

Gruß,
squirrel


----------



## Wildcard (27. Apr 2007)

squirrel hat gesagt.:
			
		

> Kann ich mich evtl. bei Fragen nochmal melden?


Ich würde mal behaupten dafür gibt es das Forum  :wink: 



> Der erste Milestone war, das Konzept, das Klassendesign und das visuelle GUI-Design zu erarbeiten und vorzustellen. Also UML haben wir schon ordentlich gequält... icon_wink.gif Nun sitzen wir am 2. Milestone und müssen den Prototypen entwickeln.


Ein Anschauliches Beispiel warum Analyse und Entwurfsdiagramme nicht das selbe sind  :wink: 
Gerade für solche Sachen wie Spiele, wenn man den Standard-Bereich der Widgets verlässt und sein eigenes Zeichenframework braucht ist eine gute Planung unabdingbar sonst verzettelt ihr euch hoffnungslos.
Spielt das Szenario gemeinsam durch und versuch euch Gedanken über mögliche Probleme zu machen und lasst das in euren Entwurf einfließen.
Wäre natürlich gut wenn zumindest einer von euch entsprechende Projekterfahrung hätte. Das macht vieles einfacher.


----------

