【发布时间】:2013-01-10 20:49:26
【问题描述】:
程序的流程是这样的:将第一组按钮 (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)
{
}
}
});
}
【问题讨论】:
-
你试过
setEnabled(false)吗? -
source.setEnabled(false);有效,但图像图标仍将通过 mouseEvent 删除。 -
如需尽快获得更好的帮助,请发帖SSCCE。
-
在消除悬停效果方面你想做什么具体的事情。 ?例如,鼠标移到该按钮上,悬停效果为假,然后它应该停止更改其边界线(就像在正常情况下鼠标移到按钮上时发生的那样)..或类似的东西?
-
我不希望从按钮中删除
ImageIcon。
标签: java swing mouseevent jbutton event-listener