プログラムの流れは次のようになります。1番目のボタンのセット()からの画像がleftButtonArea
2番目のボタンのセット()にドラッグされますrightButtonArea
。
各画像には、を介した一意の名前がありsetName()
ます。ドラッグされた画像の名前は、ドラッグ先のボタンの名前と比較されます。
名前が一致する場合は、その特定のボタンがホバーイベントに反応しないようにします。
.setHoverEnabled(false)
動作しません=/
イベントリスナーの無効化に関する同様のSOスレッドですが、このようなソリューションglass pane
はコンポーネント全体を対象としているようです。
リンク
編集:
どういうわけかこれは機能しますが、この方法による副作用はわかりません
source.removeMouseListener(source.getMouseListeners()[1]);
Edit2: 何か面白いものが見つかりました。これが、無効にされたボタンがまだmouseEventsに反応する理由である可能性があります。
"低レベル:コンポーネント、コンテナ、フォーカス、キー、マウス、ペイント、ウィンドウ
セマンティック:アクション、調整、アイテム、テキスト
コンポーネントを無効にすると、セマンティックイベントのみが影響を受けます。これは、コンポーネントが有効かどうかを認識しているコンポーネント自体によって直接処理されるためです。低レベルのイベントは、無効にしても影響を受けません。ラベルを無効にしたときにこれについて考えるのをやめても、ラベルはまだ表示されていました。もしそうなら、ペイントイベントが起こったに違いありません。低レベルのイベントは常に発生し、コンポーネントが有効かどうかを問い合わせるのはハンドラー次第です。」
// 1st set of 4 buttons
for(int a=0; a<4; a++){
leftButtonArea[a] = new JleftButtonArea(new ImageIcon(image));
TransferHandler transfer = new TransferHandler("icon");
leftButtonArea[a].setTransferHandler(transfer);
leftButtonArea[a].addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
JleftButtonArea leftButtonArea = (JleftButtonArea)e.getSource();
TransferHandler handle = leftButtonArea.getTransferHandler();
handle.exportAsDrag(leftButtonArea, e, TransferHandler.COPY);
// get unique name for the image that is dragged
// to rightButtonArea
name1 = e.getComponent().getName();
}
});
}
// creates 2nd set of 4 buttons
for(int b=0; b<4; b++){
rightleftButtonAreaArea[b] = new JleftButtonArea();
// <---- creates unique name for each leftButtonArea ----->
cc2 += 1;
id2+="a"+cc2;
rightleftButtonAreaArea[b].setName(id2);
// <---- creates unique name for each leftButtonArea ----->
TransferHandler transfer1 = new TransferHandler("icon");
rightleftButtonAreaArea[b].setTransferHandler(transfer1);
rightleftButtonAreaArea[b].addMouseListener(new MouseAdapter(){
@Override
public void mouseExited(MouseEvent me){
JleftButtonArea source = (JleftButtonArea)me.getSource();
try{
// compare unique name of image and the button in rightButtonArea
// if they are the same, disable hover for the button
if( name1.equals(source.getName())){
// this doesn't work
source.getName().setHoverEnabled(false);
// Somehow this works, but I am not sure of any side effects from this
source.removeMouseListener(source.getMouseListeners()[1]);
}
else{
source.setIcon(null);
}
}
catch (NullPointerException e)
{
}
}
});
}