禁用一组JButton中特定JButton的mouseEvent

时间:2013-01-27 10:17:42

标签: java swing mouseevent jbutton event-listener

程序流程如下:第一组按钮(leftButtonArea)中的图像被拖动到​​第二组按钮(rightButtonArea)。

每张图片都有一个唯一的名称setName()。拖动的图像名称将与拖动它的按钮名称进行比较。

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

.setHoverEnabled(false)不起作用= /

关于禁用事件监听器的类似SO线程,但似乎使用glass pane的解决方案是针对整个组件的吗? link

修改 不知何故,这是有效的,但我不确定这种方法有任何副作用 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) 
    {

    }

    }       

    });
}

2 个答案:

答案 0 :(得分:4)

答案 1 :(得分:0)

尝试

button.setRolloverEnabled(假);