0

程序的流程是这样的:将第一组按钮 ( leftButtonArea) 中的图像拖动到第二组按钮 ( rightButtonArea)。

每个图像都有一个唯一的名称,通过setName(). 被拖动的图像的名称将与它被拖动到的按钮的名称进行比较。

如果名称匹配,我希望禁用该特定按钮对任何悬停事件作出反应。

.setHoverEnabled(false)不工作=/

关于禁用事件侦听器的类似 SO 线程,但似乎使用 a 的解决方案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) 
    {

    }

    }       

    });
}
4

2 回答 2

4
于 2013-01-27T11:02:31.000 回答
0

尝试

button.setRolloverEnabled(false);

于 2013-09-24T09:00:53.693 回答