java swing中如何实现对于鼠标监听悬停事件

qq_22874959 2015-03-25 09:59:45
addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseMoved(MouseEvent e) {

//只能监测鼠标在组件上的移动,如何监测鼠标在组件上悬停了3秒的时间?
//如果用计时器校验的话,如何避免在校验的两个时间点上正好鼠标回到了同一位置的尴尬情况.

}

}
...全文
803 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyfhz 2017-03-14
  • 打赏
  • 举报
回复
用全局变量记录最后一次移动鼠标(或者根据需要,最后一次进入对象,那需要两个变量)的时刻, 然后当定时器时间到了如果鼠标不在目标体上面(可以通过全局变量来判断)就什么都不做;如果在目标体上面,再判定是不是真的悬停了足够时间了,如果不够再追加一伤停补时。
进击的小宇宙 2017-03-14
  • 打赏
  • 举报
回复
你可以试试0.5秒检测一次,在同一位置就count+1,当三秒后,count == 6的时候就可以实现动作了,如果有误差就调整一下时间间隔和count的值
jdshenyang 2015-12-21
  • 打赏
  • 举报
回复

package com.bona.spark.ui.adapter;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

/**
 * Created by bona on 2015/12/21.
 * 鼠标悬停超过一定时长,将触发mouseHovering
 */
public abstract class MouseHoverAdapter extends MouseAdapter implements ActionListener{
    public static final int M_SEC = 100;

    private final Timer timer;

    public final static int HOVERING_INTERVAL=3* M_SEC;

    private MouseEvent lastEvent;

    public MouseHoverAdapter() {
        this(HOVERING_INTERVAL);
    }

    public MouseHoverAdapter(int delay) {
        this.timer = new Timer(delay, this);
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        lastEvent=e;
        timer.start();
    }

    @Override
    public void mouseMoved(MouseEvent e) {
        lastEvent=e;
        timer.restart();
    }

    @Override
    public void mouseExited(MouseEvent e) {
        lastEvent=e;
        timer.stop();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        timer.stop();
        mouseHovering(lastEvent);
    }

    public abstract void mouseHovering(MouseEvent e) ;
}

evangelionxb 2015-03-25
  • 打赏
  • 举报
回复
我的想法不知道对不对你可以看看

import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.Calendar;
import java.util.Date;

import javax.swing.JFrame;
import javax.swing.Timer;

public class MyFrame extends JFrame  {
	
	private Date lastTime; 
	
	public Date getLastTime() {
		return lastTime;
	}

	public void setLastTime(Date lastTime) {
		this.lastTime = lastTime;
	}

	public void createAndShowUI(){
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container contentPane = getContentPane();
		
		addMouseListener(new MouseListener(){

			public void mouseClicked(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}

			public void mouseEntered(MouseEvent e) {
				// TODO Auto-generated method stub
				lastTime = Calendar.getInstance().getTime();
			}

			public void mouseExited(MouseEvent e) {
				// TODO Auto-generated method stub
				lastTime = null;
			}

			public void mousePressed(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}

			public void mouseReleased(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}
			
		});
		
		setPreferredSize(new Dimension(300,200));
		pack();
		setLocationRelativeTo(null);
		setVisible(true);
		
	}
	
	public static void main(String[] args) {
		
		final MyFrame frame = new MyFrame();
		frame.createAndShowUI();
		
		ActionListener listener = new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				if(frame.getLastTime()!=null){
					Date last = frame.getLastTime();
					Date now = Calendar.getInstance().getTime();
					if((now.getTime()-last.getTime())>3000){
						System.out.println("悬浮了3秒");
					}
				}
			}
		};
		int delay = 1000;
		Timer timer = new Timer(delay,listener);
		timer.start();
		
	}
	
}


67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧