【问题标题】:Java mouse hover event while left mouse key is pressed按下鼠标左键时的Java鼠标悬停事件
【发布时间】:2018-08-18 20:54:23
【问题描述】:

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

这不起作用(移动鼠标时更改相同的按钮而不是更改另一个按钮):

import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JToggleButton;

public class ButtonClickOnHover {
    public void clickOnButtonOnHover(JToggleButton button) {
        button.addMouseMotionListener(new MouseMotionListener() {

            @Override
            public void mouseMoved(MouseEvent e) {

            }

            @Override
            public void mouseDragged(MouseEvent e) {
                button.doClick(0);
            }

        });
    }
}

试过了,没用(他的实现有什么问题?):

import java.awt.Color;
import java.awt.Component;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.SwingUtilities;

public class ButtonClickOnHover {
    public void clickOnButtonOnHover(JPanel panel) {
        panel.addMouseMotionListener(new MouseMotionListener() {



    @Override
    public void mouseMoved(MouseEvent e) {

    }

    @Override
    public void mouseDragged(MouseEvent e) {
        Point location = MouseInfo.getPointerInfo().getLocation();
        JPanel parent = (JPanel) e.getComponent();
        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() 对我来说也可以(这样我们就可以避免切换按钮开/关问题)
  • 所以您希望能够选择一个区域并触发其中的按钮?
  • @lipilocid,你做过调试吗?您是否在代码中添加了任何 System.out.println(..) 语句以查看您的代码是否正在执行?发布正确的minimal reproducible example 来证明您的问题。

标签: java swing keyevent


【解决方案1】:

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 );
}

以上代码尝试将鼠标在屏幕上的位置转换为当前所在的组件。

【讨论】:

  • 我尝试实施您的解决方案,但它不起作用。我的代码有什么问题(见上文)?
  • 为什么要将监听器添加到面板中?我不建议在任何地方这样做。如果将侦听器添加到面板,则不需要使用“getParent()”方法,因为您已经拥有对包含所有按钮的面板的引用作为 MouseEvent 的源。因此,您向面板添加侦听器的建议是合理的,但我不确定该事件是否会传递给面板。切换按钮可能有自己的 MouseMotionListener。
  • 我只是试图解决 JPanel parent = e.getComponent();如果我将它转换为 JPanel 运行时会抛出错误:线程“AWT-EventQueue-0”中的异常 java.lang.ClassCastException:javax.swing.JToggleButton 无法在 ButtonClickOnHover$1.mouseDragged(ButtonClickOnHover. java:24)
  • 如果我把它改成组件:Component parent = e.getComponent();比我不能使用 findComponentAt
  • 正如我所说,代码未经测试,但您需要了解这个概念。侦听器被添加到切换按钮,因此 e.getComponent() 将返回切换按钮。然后您需要获取切换按钮的父级,这将是一个 JPanel(我假设)。在我的原始代码中,我忘记添加 getParent() 方法。为了更好地帮助您理解该过程,我分两步更改了代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 2014-01-14
  • 2016-03-15
  • 2011-02-28
  • 2021-03-23
  • 2018-08-13
  • 2016-08-08
相关资源
最近更新 更多