2011-07-05 9 views
8

Implementando "Kings 'Corners" (glorificado Solitario multijugador) en Java.¿Cómo se puede detectar un evento de clic de mouse en un objeto Image en Java?

Estoy tratando de permitir que un jugador arrastre una tarjeta (imagen) desde su mano a otro lugar en la mesa. El problema es que la mano del jugador se "avienta" para que las imágenes de las cartas se roten y se superpongan.

Aquí se muestra un ejemplo de una mano:

enter image description here

He pensado en hacer cada tarjeta un JPanel, pero el problema entonces es que tendría que pintar el interior de su tarjeta de girar rectangularJPanel, ya que ellos mismos no se pueden girar. Idealmente, me gustaría evitar las fórmulas mouse-x, y para determinar qué tarjeta se está eligiendo.

Usando un enfoque basado en eventos, ¿cómo puedo determinar qué tarjeta se elige de la mano?

+4

Hm, ¿qué tal si usas una o más clases concretas derivadas de la interfaz Shape? Esto tiene un método contiene que sería útil. La rotación sería fácil por uso de AffineTransform. –

Respuesta

5

Los componentes AWT (y Swing) son normalmente rectangulares (alineados a los ejes).

Pero esto no tiene que ser el caso, mientras que los límites reales deben ser rectangulares, el área real que utiliza un componente puede ser más pequeña. El componente admite un método contains(Point), que el mecanismo de envío de eventos llamará cada vez que surja la pregunta sobre a qué componente pertenece un punto, por ejemplo, para clics del mouse. (La superposición de diferentes componentes se manejará mediante el orden z dentro del contenedor primario.)

Puede implementar este método según el método Shape.contains(), utilizando un rectángulo transformado afín como forma. Cada uno de sus componentes girados conocería su propia forma (o la generaría sobre la marcha desde su AffineTransform, la misma que también se usaría para pintar).

Disponga de un LayoutManager personalizado que organiza sus tarjetas también. (No utilice CardLayout, a pesar del nombre.)

No estoy seguro de que siga el camino de tener componentes separados para cada tarjeta, pero que sin duda necesita algunos objetos que representan los rectángulos girados.

+0

Funcionó perfectamente. La solución es usar createTransformedShape de AffineTransform y luego verificar si esa forma contiene el punto de un clic del mouse. Gracias. – rtheunissen

+0

@ paranoid-android: Debe aceptar esta respuesta haciendo clic en la marca de la izquierda de esta respuesta. –

+0

@Martijn Courteaux: Y así aprendemos. Gracias. – rtheunissen

Cuestiones relacionadas