Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.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 MouseListener没有检查JCheckBox就开枪了_Java_Swing - Fatal编程技术网

Java MouseListener没有检查JCheckBox就开枪了

Java MouseListener没有检查JCheckBox就开枪了,java,swing,Java,Swing,这一个很疯狂: 我有一个AppSight记录(对于那些不熟悉的人来说,它记录了他们所做的事情,包括键盘/鼠标输入+网络流量等),记录了一个客户复制的bug。基本上,我们在屏幕上列出了一系列项目,左侧是JCheckBox es。我们为JPanel安装了一个鼠标听筒,看起来像这样: private MouseAdapter createMouseListener() { return new MouseAdapter(){ public void mousePressed(

这一个很疯狂:

我有一个AppSight记录(对于那些不熟悉的人来说,它记录了他们所做的事情,包括键盘/鼠标输入+网络流量等),记录了一个客户复制的bug。基本上,我们在屏幕上列出了一系列项目,左侧是JCheckBox es。我们为JPanel安装了一个鼠标听筒,看起来像这样:

private MouseAdapter createMouseListener() {
    return new MouseAdapter(){
        public void mousePressed( MouseEvent e ) {

            if( e.getComponent() instanceof JCheckBox ) {
                // Do stuff
            }
        }
    };
}
private MouseAdapter createMouseListener() { 
    return new MouseAdapter(){ 
        public void mouseReleased( MouseEvent e ) { 

            if( e.getComponent() instanceof JCheckBox ) { 
                // And just to be sure....
                JCheckBox jcb = (JCheckBox) e.getComponent();
                if(jcb.isSelected())
                {
                    // Do stuff  
                }
            } 
        } 
    }; 
} 
根据记录,他们似乎非常强烈地点击了其中一个复选框的上方。在那之后,我相信这个听众被解雇了,“做事”的障碍发生了。但是,它没有选中该框。然后,用户看到该框未选中,于是单击它。这导致“Do stuff”块再次开火,从而取消了它第一次所做的操作。这一次,复选框被选中。因此,用户认为该框已选中,看起来是这样,但我们的客户端认为该框未选中,因为它被单击了两次

这可能吗?就我的一生而言,我无法复制它,也看不出它是如何可能的,但根据客户端发送给服务器的记录和数据,我看不到任何其他逻辑解释


任何帮助、想法和/或想法都将不胜感激。

可能用户单击了复选框,但在释放鼠标按钮之前,他将鼠标从组件上移开。我很确定在这种情况下不会选中复选框,尽管在这种情况下不太确定事件线程的行为。

我不认为您可以假设,因为鼠标被按下复选框,所以它也会在复选框上释放。也许你可以这样做:

private MouseAdapter createMouseListener() {
    return new MouseAdapter(){
        public void mousePressed( MouseEvent e ) {

            if( e.getComponent() instanceof JCheckBox ) {
                // Do stuff
            }
        }
    };
}
private MouseAdapter createMouseListener() { 
    return new MouseAdapter(){ 
        public void mouseReleased( MouseEvent e ) { 

            if( e.getComponent() instanceof JCheckBox ) { 
                // And just to be sure....
                JCheckBox jcb = (JCheckBox) e.getComponent();
                if(jcb.isSelected())
                {
                    // Do stuff  
                }
            } 
        } 
    }; 
} 

我一读到这个答案就知道它是对的。打开应用程序并复制第一次尝试。谢谢你的帮助!