2012-01-18 20 views
3

* .pngイメージを表示するカスタムコンポーネントがあります。画像には透明で不透明な領域があります。コンポーネントにActionListener(またはMouseClickListener)を追加すると、コンポーネントの透明領域をクリックしてもイベントが発生します。視覚的には、コンポーネントの外側をクリックするように見えます。 どのような領域をクリックに反応させるべきか宣言することができますか?Java。スイング。 JComponentのクリック可能な領域

イベントオブジェクトからの座標をイメージから取得し、その透明度を確認する方法について読んだことがあります。それは難しく、効果がないようです。

おそらく、このコンポーネントのカスタムボーダーなどを定義していますか?

+3

あなたは、マウスクリックの座標が、私はそのような場合について書いた非透明領域 – Alex

+0

から来たかどうかを確認するためにあなたのリスナー内のチェックを追加しようとすることができます。それは十分に複雑です。 mouseEnter()ハンドラでチェックする場合は、マウスの各点を何度も確認してください。そして、マウスの位置ごとに、画像からそのピクセルを取得し、透明性をチェックする必要があります。多くのオーバーヘッドがあります。 –

+1

「オーバーヘッドはかなりありますが、実際にはJavaは自動的にすべての画像を処理します。あるいは、あなたにとって重要なこの特定のケースに対してJavaが自動的に行います。その2番目の方が理にかなっています! –

答えて

2

どのようにクリックしているべきでないに反応する必要のある地域宣言することができますか?

これは、contains(...)メソッドをオーバーライドすることによってJComponentレベルで行われます。たとえば、JLabelを拡張してイメージをアイコンの形で含むTransparentLabelを作成します。

このメソッドが呼び出されるたびに、ピクセルが透明かどうかを判断するためにこの1つの場所を確認するだけです。

0

2枚の同じ写真をファイルにまとめてみましたが、2枚目の写真の幅を狭くしようとしましたか?そういうことで、私はあなたが両方の写真に違ったカメラを加えることができると思います。

+1

これは、例えばスターの形をしていると想像できますか?または楕円形でもあります。 –

+0

Photoshop、Gimp、ohtersなどの写真で写真をカットすることはできません。それ以外の場合は、手動で座標を確認する必要があります... –

3

あなた自身の質問に答えました。

のmousePressed()イベントハンドラ内で、あなたはJComponentの中にいるかどうかを確認した後、xにおけるピクセルをチェックして、yが透明性のためのマウスクリックの座標する必要があるとしています。

+0

私はオーバーヘッドについて書きました。たとえば、マウスを領域に置くと70%の不透明度になり、マウスが領域に入ると100%の不透明度が得られます。 私はあまりにも多くの小切手をしなければなりません。 これは唯一の方法ですか? –

+1

@イーゴシンマキシム:まず、コードを作成してください。次に、実行を測定できるときは、コードを効率的にします。 100%イメージから70%イメージを1回生成し、mouseEnterおよびmouseLeaveでイメージをスワップできます。 –

+0

私は間違っているかもしれませんが、私には、javaFXのImageViewが、透明でない領域を入力した場合にのみmouseEntered()が発生します。 Swingにも同様のクラスが存在しますか? –

1

「オーバーヘッド」についてのあなたの主な問題は、あなただけのマウスが画像の不透明部分に入るとき、それは不透明、私は事前に計算した画像「マスク」を検討したいようにしたいということであれば。画像負荷に

、(唯一の配列で、すなわち白黒のみ、又は1及び0の値)は、バイナリであろう他の画像(又は2Dアレイ、または同様のもの)を作ります。 0 /白=透明、1 /黒=不透明。

そして、マウスイベントに、あなたはそれが設定されている場合(黒又は1の値=)マスクの正確なピクセルをチェックし、それがある場合にトリガすることができます。

関連する問題