在一个GIS应用中,要鼠标在JPanel的移动过程中,根据鼠标的位置不停的要去调用一个方法来处理这样会导致在鼠标的移动过程中,要进行不断的计算,我想要让鼠标在一个位置停留一段时间后(如2秒),才开始调用方法进行处理,就算在SWING里的工具条一样,当鼠标放到工具条上要有个2秒3秒的才出工具条的提示,而不是一直在那里计算。public void mouseMoved(MouseEvent e) {
 if(鼠标在停留了 2 秒){
     query(e)
  }}我现在想到了办法就是用一个线程,进入到mouseMoved方法后,用个线程停两秒开始执行那个query(),如果这期间鼠标再有移动,那个线程就重新开始计时。不过我觉得这样做是不是不太好,不知有什么好一点方法没有?谢谢!

解决方案 »

  1.   

    用个mouseOver方法.....  呵呵..  if(鼠标在停留了 2 秒)
                                    {
                                        mouseOver();
                                        ..........
                                    } 
    try again....
      

  2.   

    MouseEvent:
    static int MOUSE_ENTERED 
              The "mouse entered" event. 
    static int MOUSE_EXITED 
              The "mouse exited" event. e.getButton()&&MOUSE_ENTERED!=0
    e.getButton()&&MOUSE_EXITED!=0public void mouseMoved(MouseEvent e) {
     if(e.getButton()&&MOUSE_ENTERED!=0){//进入
         starttime=getCurrenttime();
      }
     if(e.getButton()&&MOUSE_EXITED!=0){//退出
        if(getCurrenttime()-starttime>20000)  query(e);
      }
    }
      

  3.   

    dyhml不是太明白你的方法,不过我照着代码试了,但程序进不到
     if(e.getButton()&&MOUSE_EXITED!=0)这里来,所以这样一来始终不会执行那个方法
      

  4.   

    刚才看了以下,最好继承
    java.awt.event.MouseAdapter
    改写
    long starttime;
    void mouseEntered(MouseEvent e) 
        starttime=getCurrenttime();//可能不是这样写,反正是得到当前时间
    }
    void mouseExited(MouseEvent e) 
        if(getCurrenttime()-starttime>20000)
            query(e);
    }
      

  5.   

    TO dyhml多谢老兄的相助了我这是一个JPANEL里面的事件了,不能用到mouseEntered和mouseExited了,我是始终在这个JPanel里面移动的,只能用到mouseMoved这个事件来处理的
      

  6.   

    顺便问一下,您 做什么的还用swing
      

  7.   

    先做一个变量starttime,nowTime,isNew:boolean;

    void mousemoved(MouseEvent e) {
      //第一次进入时
    if (isNew) {
    starttime=getCurrenttime();
    isNew:=false;}
    if nowtime=getCurrenttime()-starttime>20000 {
    //do someting
    }
       }
      

  8.   

    楼上的一些方法都不行。
    要移到一个位置上停留两秒才开始执行,基本流程就是这样:首先鼠标移动,执行mouseMoved,但不执行query()
    然后鼠标停止,这个时候mouseMoved的方法也不会被执行了
    两秒后,鼠标还是处于停止状态,mouseMoved方法也不会再被执行了,这个时候再执行query()楼上的一些处理都是建立在mouseMoved里面用一个时间相减,当停留两秒的时候,这个时候鼠标是不动的,根本就不可能再执行mouseMoved这个方法,这个时候怎么又能让它在这个方法里做个判断后再执行query()了?
      

  9.   

    能用单击就根本不用考虑这么多了,这是一个电子地图中应用,鼠标进入到某些区域的时候出现该区域的文字或提示性的文字,整个图都是这些,点来点去用户操作起来不太爽。
    看来硬还是没有一个好办法,要用我开始想的那个不爽的方法了啊?
    用一个线程来处理的话,一有mouseMoved就启动那个线程,线程里停两秒就开始执行。如果在线程的停留两秒的期间,再有另外的移动,就让线程再重新开始计时两秒,这样是可以实现这种效果的,但我觉得这样弄会搞的处理起来比较慢,因为鼠标是漫无边际不停的移来移去,这样那个线程里不停的计时不停销毁重来。
    其实这个东西就是跟工具条的提示性文字是一个意思的.兄弟们再多帮忙想想办法啊顶!
      

  10.   

    写了个另起线程的处理,大概就是:
    public void run(){
        try{
    Thread.sleep(500);
        }catch(Exception e){}
         query();
    }public void mouseMoved(MouseEvent e) {
    x = e.getPoint().x;
    y = e.getPoint().y;
    if(threadTextInfo == null){
    threadTextInfo = new Thread(rShowText);
    threadTextInfo.start();
    }else{
             threadTextInfo.stop();
    threadTextInfo = new Thread(rShowText);
    threadTextInfo.start();
         }
    }效果是达到了,500毫秒后才启动,不过我总觉得这样方法不太好
      

  11.   

    使用swing 是Timer计时器类,
    具体使用如下:class Actio implements ActionListener
      {
        public void actionPerformed(ActionEvent evt)
        {
           query();
        }
      }
      Timer t=new Timer(2000,new Action());
      public void mouseMoved(MouseEvent e) {
        if(t.isRunning())
          t.restart();
        else
          t.start();      
      }