Java MouseListener没有检查JCheckBox就开枪了
这一个很疯狂: 我有一个AppSight记录(对于那些不熟悉的人来说,它记录了他们所做的事情,包括键盘/鼠标输入+网络流量等),记录了一个客户复制的bug。基本上,我们在屏幕上列出了一系列项目,左侧是JCheckBox es。我们为JPanel安装了一个鼠标听筒,看起来像这样:Java MouseListener没有检查JCheckBox就开枪了,java,swing,Java,Swing,这一个很疯狂: 我有一个AppSight记录(对于那些不熟悉的人来说,它记录了他们所做的事情,包括键盘/鼠标输入+网络流量等),记录了一个客户复制的bug。基本上,我们在屏幕上列出了一系列项目,左侧是JCheckBox es。我们为JPanel安装了一个鼠标听筒,看起来像这样: private MouseAdapter createMouseListener() { return new MouseAdapter(){ public void mousePressed(
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
}
}
}
};
}
我一读到这个答案就知道它是对的。打开应用程序并复制第一次尝试。谢谢你的帮助!