在一个GIS应用中,要鼠标在JPanel的移动过程中,根据鼠标的位置不停的要去调用一个方法来处理这样会导致在鼠标的移动过程中,要进行不断的计算,我想要让鼠标在一个位置停留一段时间后(如2秒),才开始调用方法进行处理,就算在SWING里的工具条一样,当鼠标放到工具条上要有个2秒3秒的才出工具条的提示,而不是一直在那里计算。public void mouseMoved(MouseEvent e) {
if(鼠标在停留了 2 秒){
query(e)
}}我现在想到了办法就是用一个线程,进入到mouseMoved方法后,用个线程停两秒开始执行那个query(),如果这期间鼠标再有移动,那个线程就重新开始计时。不过我觉得这样做是不是不太好,不知有什么好一点方法没有?谢谢!
if(鼠标在停留了 2 秒){
query(e)
}}我现在想到了办法就是用一个线程,进入到mouseMoved方法后,用个线程停两秒开始执行那个query(),如果这期间鼠标再有移动,那个线程就重新开始计时。不过我觉得这样做是不是不太好,不知有什么好一点方法没有?谢谢!
{
mouseOver();
..........
}
try again....
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);
}
}
if(e.getButton()&&MOUSE_EXITED!=0)这里来,所以这样一来始终不会执行那个方法
java.awt.event.MouseAdapter
改写
long starttime;
void mouseEntered(MouseEvent e)
starttime=getCurrenttime();//可能不是这样写,反正是得到当前时间
}
void mouseExited(MouseEvent e)
if(getCurrenttime()-starttime>20000)
query(e);
}
在
void mousemoved(MouseEvent e) {
//第一次进入时
if (isNew) {
starttime=getCurrenttime();
isNew:=false;}
if nowtime=getCurrenttime()-starttime>20000 {
//do someting
}
}
要移到一个位置上停留两秒才开始执行,基本流程就是这样:首先鼠标移动,执行mouseMoved,但不执行query()
然后鼠标停止,这个时候mouseMoved的方法也不会被执行了
两秒后,鼠标还是处于停止状态,mouseMoved方法也不会再被执行了,这个时候再执行query()楼上的一些处理都是建立在mouseMoved里面用一个时间相减,当停留两秒的时候,这个时候鼠标是不动的,根本就不可能再执行mouseMoved这个方法,这个时候怎么又能让它在这个方法里做个判断后再执行query()了?
看来硬还是没有一个好办法,要用我开始想的那个不爽的方法了啊?
用一个线程来处理的话,一有mouseMoved就启动那个线程,线程里停两秒就开始执行。如果在线程的停留两秒的期间,再有另外的移动,就让线程再重新开始计时两秒,这样是可以实现这种效果的,但我觉得这样弄会搞的处理起来比较慢,因为鼠标是漫无边际不停的移来移去,这样那个线程里不停的计时不停销毁重来。
其实这个东西就是跟工具条的提示性文字是一个意思的.兄弟们再多帮忙想想办法啊顶!
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毫秒后才启动,不过我总觉得这样方法不太好
具体使用如下: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();
}