# Kartenspiel - Wie realisiert man anklickbare Karten?



## snoopysalive (16. Aug 2006)

Hi!

Nachdem ich gesehen habe, dass hier viele von euch Kartenspiele programmieren, müsste ich ja an der richtigen Stelle sein.

Während sich hier schon alle mit Kollisionsabfragen beschäftigen, ist mein Anliegen wohl noch ein wenig grundlegender: In Kartenspielen klickt man auf die Karten, damit mit diesen etwas geschieht. Nur, wie muss ich vorgehen, dass Java erkennt, dass auf eine Karte geklickt wurde?

Meine Karten werden als Objekte der Klasse "Card" gehandhabt, welche von JPanel erbt. Zuerst dachte ich, es würde reichen, der Klasse einen MouseListener hinzuzufügen. Wenn ich aber über die MouseEntered-Methode abfrage, an welcher Stelle die Maus den JPanel betritt, stellt sich heraus, dass JPanels anscheinend über dieselbe Größe verfügen wie der JFrame, auf dem sie gezeichnet sind. Wenn ich einer JPanel-Klasse also einen MouseListener hinzufüge, bezieht sich der Listener auf den kompletten Panel und nicht auf eine bestimmte Komponente darin.

Als nächstes probierte ich aus, einfach dem Image-Objekt, welches das GIF-Image der Karte speichert, mit einem MouseListener auszustatten, aber da beschwert sich Java der Syntax wegen. Man kann einem Image-Objekt keinen MouseListener hinzufügen.

Schließlich hatte ich die Idee, den JPanel einfach zu verkleinern, sprich, ihn an die Größe des Karten-GIFs anzupassen. Dann könnte man dem JPanel einfach nach wie vor einen MouseListener geben und dennoch würde MouseEntered nur dann reagieren, wenn sich die Maus über dem Bild befindet. Nach etwas Googlen hieß es, man könne die JPanel-Abmessung mit den Methoden _setPreferredSize(int x, int y), setMinimumSize(int x, int y)_ und _setMaximumSize(int x, int y)_ festlegen, doch auch das hat nicht geklappt.

Weil ich jetzt keine Ideen mehr habe, möchte ich euch fragen, wie man sowas elegant löst. Ich will einfach nur anklickbare Karten haben, die nicht als JButton oder sowas realisiert sind. Am liebsten wäre mir natürlich noch immer, wenn ich einfach dem Bild den MouseListener zuordnen könnte, aber das geht ja leider nicht.

Ich möchte noch erwähnen, dass ich das Kartenspiel als Standalone und nicht als Applet schreibe.

Über Ideen zur Problemlösung würde ich mich sehr freuen!

Gruß!


----------



## Wildcard (16. Aug 2006)

Am einfachsten solltest du mit JLabels zurechtkommen. Einfach ein ImageIcon setzen und das JLabel sollte dann die Größe des Bilds (sofern du das nicht anderweitig angibts) annehmen.
Auf die Labels setzt du dann einen MouseListener.


----------



## snoopysalive (18. Aug 2006)

Danke für den Tipp. Funktioniert auch, allerdings habe ich noch nicht herausgefunden, wie man den JLabel dann frei positionieren kann (irgendwie scheint er ja nach einem Raster ausgerichtet zu sein). Trotzdem schon mal danke!


----------



## dieta (18. Aug 2006)

Um das JLabel frei positionieren zu können, musst du das Layout auf null setzen. Dann kannst du das label mit

```
Component.setBounds(int x, int y, int w, int h);
```
pixelgenau positionieren.


----------

