代码之家  ›  专栏  ›  技术社区  ›  Morinar

在未选中jcheckbox的情况下激发了mouseListener

  •  1
  • Morinar  · 技术社区  · 16 年前

    这个相当疯狂:

    我有一个客户复制bug的AppSight记录(对于不熟悉的人来说,这是他们所做的记录,包括键盘/鼠标输入+网络流量等)。基本上,我们在屏幕上列出了一系列项目,jcheckbox在左侧。我们为jpanel准备了一套鼠标测试器,看起来像这样:

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

    根据记录,它们单击其中一个复选框的正上方似乎非常强烈。在那之后,我相信这个听者被炒鱿鱼了,“做事情”的障碍也发生了。但是,它没有选中该框。用户随后看到该框未选中,因此单击了该框。这导致“做事情”块再次触发,从而撤销了它第一次做的事情。这一次,复选框被选中。因此,用户认为该框是选中的,看起来是选中的,但是我们的客户认为该框是未选中的,因为它被单击了两次。

    这有可能吗?在我的生活中,我不能复制它,也看不到它是如何可能的,但是基于记录和客户机发送到服务器的数据,我看不到任何其他的逻辑解释。

    任何帮助、想法和/或想法都将非常感谢。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Federico Cristina    16 年前

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

        2
  •  1
  •   Catchwa    16 年前

    我认为你不能假设因为老鼠 按下 在复选框上,它也将 释放 在复选框上。也许只是这样做:

    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  
                    }
                } 
            } 
        }; 
    }