Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:检测三次单击而不触发双击_Java_Swing_Mouseevent_Double Click - Fatal编程技术网

Java:检测三次单击而不触发双击

Java:检测三次单击而不触发双击,java,swing,mouseevent,double-click,Java,Swing,Mouseevent,Double Click,我有一个JTable,我想在双击单元格时调用一个函数,在三次单击单元格时调用另一个函数 当单元格被三次单击时,我不想调用双击函数 我现在拥有的是(mgrdAlarm是JTable): 双击控制台时,控制台显示: getClickCount() = 1 getClickCount() = 2 Completed : doubleClick() getClickCount() = 1 getClickCount() = 2 Completed : doubleClick() getClickCou

我有一个JTable,我想在双击单元格时调用一个函数,在三次单击单元格时调用另一个函数

当单元格被三次单击时,我不想调用双击函数

我现在拥有的是(mgrdAlarm是JTable):

双击控制台时,控制台显示:

getClickCount() = 1
getClickCount() = 2
Completed : doubleClick()
getClickCount() = 1
getClickCount() = 2
Completed : doubleClick()
getClickCount() = 3
Completed : tripleClick()
三次单击时,控制台显示:

getClickCount() = 1
getClickCount() = 2
Completed : doubleClick()
getClickCount() = 1
getClickCount() = 2
Completed : doubleClick()
getClickCount() = 3
Completed : tripleClick()
三次单击时,我希望控制台显示:

getClickCount() = 1
getClickCount() = 2
getClickCount() = 3
Completed : tripleClick()
因此,我不希望在双击单元格时调用函数doubleClick(),但我确实希望在双击单元格时调用函数doubleClick()

[编辑]

所有回复都表明,解决方案似乎是延迟双击操作,并等待三次单击的特定时间

但正如所讨论的,这可能会导致不同类型的问题: 用户可能已经设置了很长的双击时间,这可能与我的三次单击超时重叠

如果我的双击操作在我的三次单击操作之前执行,这并不是真正的灾难,但它确实会产生一些额外的开销,特别是一些我想要阻止的额外数据流量


由于到目前为止唯一的解决方案可能会导致其他问题,而这些问题实际上可能比原来的问题更糟糕,因此我将保持现状。

您需要延迟执行
双击
,以检查其是否为
三次单击

暗示


如果
getClickCount()==2
则将其置于等待状态。。对于类似于
200ms

的情况,您可以这样做,改变延迟时间:

public class ClickForm extends JFrame {

final static long CLICK_FREQUENTY = 300;

static class ClickProcessor implements Runnable {

    Callable<Void> eventProcessor;

    ClickProcessor(Callable<Void> eventProcessor) {
        this.eventProcessor = eventProcessor;
    }

    @Override
    public void run() {
        try {
            Thread.sleep(CLICK_FREQUENTY);
            eventProcessor.call();
        } catch (InterruptedException e) {
            // do nothing
        } catch (Exception e) {
            // do logging
        }
    }
}

public static void main(String[] args) {
    ClickForm f = new ClickForm();
    f.setSize(400, 300);
    f.addMouseListener(new MouseAdapter() {
        Thread cp = null;
        public void mouseClicked(MouseEvent e) {
            System.out.println("getClickCount() = " + e.getClickCount() + ", e: " + e.toString());

            if (cp != null && cp.isAlive()) cp.interrupt();

            if (e.getClickCount() == 2) {
                cp = new Thread(new ClickProcessor(new Callable<Void>() {
                    @Override
                    public Void call() throws Exception {
                        System.out.println("Double click processed");
                        return null;
                    }
                }));
                cp.start();
            }
            if (e.getClickCount() == 3) {
                cp =  new Thread(new ClickProcessor(new Callable<Void>() {
                    @Override
                    public Void call() throws Exception {
                        System.out.println("Triple click processed");
                        return null;
                    }
                }));
                cp.start();
            }
        }
    });
    f.setVisible(true);
}
}
公共类ClickForm扩展JFrame{
最终静态长点击频率=300;
静态类ClickProcessor实现可运行{
可调用事件处理器;
ClickProcessor(可调用事件处理器){
this.eventProcessor=eventProcessor;
}
@凌驾
公开募捐{
试一试{
睡眠(频繁点击);
eventProcessor.call();
}捕捉(中断异常e){
//无所事事
}捕获(例外e){
//伐木
}
}
}
公共静态void main(字符串[]args){
ClickForm f=新建ClickForm();
f、 设置大小(400300);
f、 addMouseListener(新的MouseAdapter(){
线程cp=null;
公共无效mouseClicked(MouseEvent e){
System.out.println(“getClickCount()=”+e.getClickCount()+”,e:“+e.toString());
如果(cp!=null&&cp.isAlive())cp.interrupt();
如果(如getClickCount()==2){
cp=新线程(新的ClickProcessor(新的可调用的)(){
@凌驾
public Void call()引发异常{
System.out.println(“双击已处理”);
返回null;
}
}));
cp.start();
}
如果(如getClickCount()==3){
cp=新线程(新的ClickProcessor(新的可调用的)(){
@凌驾
public Void call()引发异常{
System.out.println(“三次点击处理”);
返回null;
}
}));
cp.start();
}
}
});
f、 setVisible(真);
}
}

这与检测双击而不触发单击完全相同。您必须延迟触发事件,直到您确定没有后续单击。

前面的答案是正确的:您必须考虑时间安排,并延迟将其识别为双击,直到经过一定的时间。挑战在于,正如您所注意到的,用户可能有一个很长或很短的双击阈值。因此,您需要知道用户的设置是什么。另一个堆栈溢出线程()提到了
awt.multiClickInterval
desktop属性。尝试将其用作阈值。

有一个关于此的教程

编辑:它会单独触发click事件,因此您将获得: 然后单击一下 然后双击 三次点击。所以你仍然需要做一些计时的把戏

代码是:

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JTextField;

public class Main {
  public static void main(String[] argv) throws Exception {

    JTextField component = new JTextField();
    component.addMouseListener(new MyMouseListener());
    JFrame f = new JFrame();

    f.add(component);
    f.setSize(300, 300);
    f.setVisible(true);

    component.addMouseListener(new MyMouseListener());
  }
}

class MyMouseListener extends MouseAdapter {
  public void mouseClicked(MouseEvent evt) {
    if (evt.getClickCount() == 3) {
      System.out.println("triple-click");
    } else if (evt.getClickCount() == 2) {
      System.out.println("double-click");
    }
  }
}

这是我为实现这一目标所做的,这对我来说确实很好。检测点击类型需要延迟。你可以选择。如果在400ms内发生三次点击,则以下延迟。您可以将其减小到无法连续单击的程度。如果您只是担心延迟,那么这是一个可以忽略不计的延迟,这对于执行此操作至关重要

这里的
flag
t1
是全局变量

public void mouseClicked(MouseEvent e)
{
int count=e.getClickCount();
                    if(count==3)
                    {
                        flag=true;
                        System.out.println("Triple click");
                    }
                    else if(count==2)
                    {
                        try
                        {
                        t1=new Timer(1,new ActionListener(){
                            public void actionPerformed(ActionEvent ae)
                            {
                                if(!flag)
                                System.out.println("Double click");
                                flag=false;
                                t1.stop();
                            }
                        });
                        t1.setInitialDelay(400);
                        t1.start();
                        }catch(Exception ex){}
                    }
}

隐马尔可夫模型。。。延迟执行?一个相当有趣的话题,但解决起来并不简单。你可能想开始阅读。单击和双击会出现相同的问题。您需要在代码中实现一些时间跟踪。如何实现自定义事件队列并检测一个、两个或三个单击此处?@kmartens谢谢您的回答。这似乎是一条路,但在阅读了另一个主题后,我认为这可能会引起额外的问题。请参阅我的文章编辑。@LadislavDANKO对不起,我还没有Java方面的经验。你到底是什么意思,我该怎么做?我也有同样的问题@EJP谢谢你的回答。这似乎是一条路,但在阅读了另一个主题后,我认为这可能会引起额外的问题。请参阅我的文章编辑。谢谢你的回答。这似乎是一条路,但在阅读了另一个主题后,我认为这可能会引起额外的问题。请参阅我的文章编辑。谢谢你的回答。这似乎是一条路,但在阅读了另一个主题后,我认为这可能会引起额外的问题。看到我的编辑我的帖子。谢谢你的回答。。。检测点击并不是那么难,只检测双击或三次点击(不触发较小的点击事件)才是问题所在。。。定时测量