程序流程如下:将第一组按钮(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中实现了MouseEventButtonModel
Icon in the JButton API使用已实现的方法
例子JButton & IconJButton & ButtonModel

08-06 03:57
查看更多