2011-07-05 10 views
8

Javaで "キングスコーナー"(栄光のマルチプレイヤーソリティア)を実装しています。JavaのImageオブジェクトでマウスクリックイベントを検出するにはどうすればよいですか?

私は、プレイヤーがカード(画像)を手札からテーブルのどこかにドラッグできるようにしようとしています。問題は、プレイヤーの手が「扇動」され、カードの画像が回転して重なってしまうことです。ここで

は手の一例である:

enter image description here

私は各カードにJPanelを作ると考えられてきましたが、問題は、私はその内部で回転カードをペイントする必要があるだろうということですの長方形JPanelのように、回転させることはできません。理想的には、どのカードが選択されているかを判断するために、mouse-x、yの式を避けたいと思います。

イベントドリブンアプローチを使用すると、どのカードを手から選択するかをどのように判断できますか?

+4

Hm、Shapeインターフェイスから派生した1つまたは複数の具象クラスを使用するにはどうしたらよいですか?これには便利な関数が含まれています。 AffineTransformの使用ごとに回転が簡単になります。 –

答えて

5

AWT(およびSwing)コンポーネントは通常、長方形(軸に揃えられます)です。

しかし実際の境界は長方形でなければならないわけではありませんが、コンポーネントが使用する実際の領域は小さくすることができます。コンポーネントは、contains(Point)メソッドをサポートしています。このメソッドは、ポイントが属するコンポーネント(マウスのクリックなど)に問題が発生するたびに、イベントディスパッチメカニズムによって呼び出されます。

このメソッドは、Shape.contains()メソッドに基づいて、アフィン変換矩形をシェイプとして使用して実装できます。このコンテナは、コンテナ内のzオーダーによって処理されます。あなたの回転されたコンポーネントのそれぞれは、独自の形状を知っています(または、それ自身の絵に使用されるAffineTransformからその場で生成します)。

あなたのカードも手配するカスタムLayoutManagerがあります。

カードごとに別々のコンポーネントを使用する方法はわかりませんが、回転した四角形を表すオブジェクトが必要です(確かに名前にもかかわらずCardLayoutを使用しないでください)。

+0

完璧に作業しました。解決策は、AffineTransformのcreateTransformedShapeを使用し、そのシェイプにマウスクリックのポイントが含まれているかどうかを確認することです。ありがとう。 – rtheunissen

+0

@ paranoid-android:あなたはこの回答の左側のチェックをクリックしてこの回答を受け入れるべきです。 –

+0

@Martijn Courteaux:だから私たちは学びます。ありがとう。 – rtheunissen

関連する問題