按下鼠标左键时Java鼠标悬停事件

按下鼠标左键时Java鼠标悬停事件,java,swing,keyevent,Java,Swing,Keyevent,在一个面板中,我有一个10*10的切换按钮。我的目标是完成这项活动: 如果鼠标左键按下且鼠标位于特定按钮上方,则调用“单击按钮”行。因此,用户可以轻松地选择(单击)多个按钮 这不起作用(移动鼠标时更改同一个按钮,而不是更改其他按钮): 尝试了这个,但没有工作(他的实现有什么问题?): mouseDragged事件的源始终是您第一次生成mousePressed事件的组件,即使您将鼠标移动到另一个组件上 如果你想知道鼠标当前在哪个组件上,你需要做一些额外的工作 比如: Point location

在一个面板中,我有一个10*10的切换按钮。我的目标是完成这项活动: 如果鼠标左键按下且鼠标位于特定按钮上方,则调用“单击按钮”行。因此,用户可以轻松地选择(单击)多个按钮

这不起作用(移动鼠标时更改同一个按钮,而不是更改其他按钮):

尝试了这个,但没有工作(他的实现有什么问题?):


mouseDragged事件的源始终是您第一次生成mousePressed事件的组件,即使您将鼠标移动到另一个组件上

如果你想知道鼠标当前在哪个组件上,你需要做一些额外的工作

比如:

Point location = MouseInfo.getPointerInfo().getLocation();
Component button = e.getComponent();
JPanel parent = (JPanel)button.getParent();
SwingUtilities.convertPointFromScreen(location, parent);
Component mouseOver = parent.findComponentAt( location );

if (mouseOver instanceof JToggleButton)
{
    JToggleButton button = (JToggleButton)mouseOver;
    button.setBackground( Color.YELLOW );
}

上面的代码试图转换屏幕上的鼠标位置,以找到它当前所在的组件。

mouseDragged事件的源始终是您第一次生成mousePressed事件的组件,即使您将鼠标移动到另一个组件上

如果你想知道鼠标当前在哪个组件上,你需要做一些额外的工作

比如:

Point location = MouseInfo.getPointerInfo().getLocation();
Component button = e.getComponent();
JPanel parent = (JPanel)button.getParent();
SwingUtilities.convertPointFromScreen(location, parent);
Component mouseOver = parent.findComponentAt( location );

if (mouseOver instanceof JToggleButton)
{
    JToggleButton button = (JToggleButton)mouseOver;
    button.setBackground( Color.YELLOW );
}

上面的代码试图转换屏幕上的鼠标位置,以找到它当前所在的组件。

我不确定是否理解这个概念。当您将鼠标拖动到切换按钮上时,您将不断为切换按钮生成mouseDragged事件,这意味着您将为移动的每个像素不断调用doClick()方法。我只想为当前处于悬停状态的按钮调用doClick()。而不是doClick()如果代码将按钮的背景颜色更改为黄色(这样我们可以避免切换按钮的开/关问题),这样您就可以选择一个区域并触发其中的按钮,这对我来说也没问题?@lipirocid,您进行过任何调试吗?您是否在代码中添加了System.out.println(..)语句以查看代码是否正在执行?张贴一个适当的演示你的问题。我不确定我是否理解这个概念。当您将鼠标拖动到切换按钮上时,您将不断为切换按钮生成mouseDragged事件,这意味着您将为移动的每个像素不断调用doClick()方法。我只想为当前处于悬停状态的按钮调用doClick()。而不是doClick()如果代码将按钮的背景颜色更改为黄色(这样我们可以避免切换按钮的开/关问题),这样您就可以选择一个区域并触发其中的按钮,这对我来说也没问题?@lipirocid,您进行过任何调试吗?您是否在代码中添加了System.out.println(..)语句以查看代码是否正在执行?张贴一个适当的演示你的问题。我试图实施你的解决方案,但它不起作用。我的代码有什么问题(见上文)?为什么要将侦听器添加到面板?我不建议在任何地方这样做。如果将侦听器添加到面板中,则不需要使用“getParent()”方法,因为您已经将包含所有按钮的面板引用作为MouseEvent的源。因此,您建议只在面板中添加一个侦听器是合理的,但我不确定事件是否会传递给面板。切换按钮可能有自己的MouseMotionListener;如果我将其转换为JPanel,运行时会抛出错误:线程“AWT-EventQueue-0”java.lang.ClassCastException中的异常:javax.swing.JToggleButton不能转换为ButtonClickOnHover$1处的javax.swing.JPanel。如果我将其更改为component:component parent=e.getComponent(),则mouseDragged(ButtonClickOnHover.java:24);我不能使用findComponentAtAs,我说过代码没有经过测试,但是你需要理解这个概念。监听器被添加到切换按钮,因此e.getComponent()将返回切换按钮。然后您需要获得切换按钮的父级,它将是一个JPanel(我假设)。在我的原始代码中,我忘记添加getParent()方法。为了更好地帮助您理解这个过程,我更改了代码,分两步执行。我试图实现您的解决方案,但它不起作用。我的代码有什么问题(见上文)?为什么要将侦听器添加到面板?我不建议在任何地方这样做。如果将侦听器添加到面板中,则不需要使用“getParent()”方法,因为您已经将包含所有按钮的面板引用作为MouseEvent的源。因此,您建议只在面板中添加一个侦听器是合理的,但我不确定事件是否会传递给面板。切换按钮可能有自己的MouseMotionListener;如果我将其转换为JPanel,运行时会抛出错误:线程“AWT-EventQueue-0”java.lang.ClassCastException中的异常:javax.swing.JToggleButton不能转换为ButtonClickOnHover$1处的javax.swing.JPanel。如果我将其更改为component:component parent=e.getComponent(),则mouseDragged(ButtonClickOnHover.java:24);我不能使用findComponentAtAs,我说过代码没有经过测试,但是你需要理解这个概念。监听器被添加到切换按钮,因此e.getComponent()将返回切换按钮。然后您需要获得切换按钮的父级,它将是一个JPanel(我假设)。在我的原始代码中,我忘记添加getParent()方法。为了更好地帮助您理解这个过程,我修改了代码,分两步完成。
Point location = MouseInfo.getPointerInfo().getLocation();
Component button = e.getComponent();
JPanel parent = (JPanel)button.getParent();
SwingUtilities.convertPointFromScreen(location, parent);
Component mouseOver = parent.findComponentAt( location );

if (mouseOver instanceof JToggleButton)
{
    JToggleButton button = (JToggleButton)mouseOver;
    button.setBackground( Color.YELLOW );
}