程序流程如下:将第一组按钮(leftButtonArea
)中的图像拖到第二组按钮(rightButtonArea
)中。
每个图像通过setName()
具有唯一的名称。将被拖动的图像名称与被拖动到的按钮名称进行比较。
如果名称匹配,我希望禁用该特定按钮以对任何悬停事件做出反应。.setHoverEnabled(false)
不起作用= /
关于禁用事件侦听器的类似SO线程,但似乎使用glass pane
的解决方案适用于整个组件?
link
编辑:
以某种方式可以工作,但是我不确定此方法有任何副作用source.removeMouseListener(source.getMouseListeners()[1]);
编辑2:
找到了一些有趣的东西。这可能是禁用的按钮仍然对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)
{
}
}
});
}
最佳答案
在Buttons JComponents中实现了MouseEvent的ButtonModel
对Icon in the JButton API使用已实现的方法
例子JButton & Icon,JButton & ButtonModel