仅当鼠标悬停在元素上至少一段特定时间时,如何触发MouseMove事件?

时间:2014-05-09 09:48:35

标签: java awt mouseevent

当用户将鼠标指针移动到JFrame的某个区域稍微延迟时,我想显示JPanel。我通过将JFrame附加到MouseAdapter并覆盖JPanel方法来显示MouseMove

addMouseListener(new MouseAdapter() {
  @Override
  public void mouseMoved(MouseEvent e) {
    Point p= e.getLocationOnScreen();
    //check if Point p is within the boundaries of a rectangle.          
    //show a JFrame
  }                
});

为了获得延迟,我认为我应该使用Thread来使用sleep,条件是如果鼠标移出边界必须中断它,但是我&# 39;我不确定这是最好的方法。 目前,我只看到与JavaScript相关的SO问题。在Java中使用它的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

您可以使用mouseEntered课程中的mouseExitedMouseAdapter个活动。

您可以在mouseEntered方法上设置计时器,并检查在对象上花费的时间是>= mouseExited方法中的指定时间,如果是,请执行操作。< / p>

对于鼠标在同一点离开的场景,你可以使用Timer延迟你想要的秒数,并在mouseExited设置一个处理程序来停止计时器指针在指定时间之前退出。

答案 1 :(得分:1)

使用java.util.Timer可能是一个很好的解决方案。

addMouseListener(new MouseAdapter() {
 private int delay = 1000;//1 second
 private Timer timer = null;
 private int startTime =0;

  @Override
  public void mouseMoved(MouseEvent e) {
    Point p= e.getLocationOnScreen();
    boolean pointInArea=false;
    //check if Point p is within the boundaries of a rectangle.          
    if(pointInArea){
        //A JFrame is queued to be shown
        if(System.currentTimeMillis()-startTime>delay){
          //A JFrame has been already shown, then show a new one
          startTime = System.currentTimeMillis();
          timer = new Timer();                    
          timer.schedule(new TimerTask(){
              @Override
              public void run() {
                //LAUNCH JFrame
              }

          }, delay);                     
        }
     }
     else (!pointInArea && timer != null){
        timer.cancel();
        timer = null;                        
     }
  }                
});