在Java中处理并发事件
我的Java代码有问题。 我需要执行doSomething()方法,其中包括管理全局变量的代码。问题是该方法被调用了两次(我的JTable的mouseEvent和focusEvent同时被激发)。 我怎样才能一次只执行一次doSomething()方法,以某种互斥的方式 谢谢在Java中处理并发事件,java,swing,events,jtable,Java,Swing,Events,Jtable,我的Java代码有问题。 我需要执行doSomething()方法,其中包括管理全局变量的代码。问题是该方法被调用了两次(我的JTable的mouseEvent和focusEvent同时被激发)。 我怎样才能一次只执行一次doSomething()方法,以某种互斥的方式 谢谢 addMouseListener (new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { do
addMouseListener (new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
doSomething();
}
});
addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e){
doSomething();
}
});
JTable单元格包含长度为1或2的字符串。
我需要应用setValue方法(或删除字符串),在用户停止单元格编辑或写入2个字符字符串的确切时刻。
对于这些监听器,我知道执行设置值或通知用户他写的第一个字符不存在的确切时间。因此,我希望通过这种方式阻止用户的操作
换句话说,我需要控制用户输入,以便执行设置值或删除它。FocusLost告诉我用户何时单击JTable组件外部。
MouseClicked告诉我用户何时单击JTable组件
当调用mouseClicked并显示JOptionPane时,单元格会自动失去焦点,因此也会调用focusLost
public void doSomething () {
// inEdit and tableCellEdited are the global variables
if ( inEdit && tableCellEdited != null ) {
String temp = "" + tableCellEdited.getDay();
String s = tableCellEdited.getValRenderer().trim();
if (s.length() > 2) s = s.substring(4);
if ( !s.trim().isEmpty() ) {
JOptionPane.showMessageDialog(getParent(),
"Code doesn't exist" , "Error: Code doesn't exist",JOptionPane.WARNING_MESSAGE);
tableCellEdited.setRendererValue(getUltimaGG(), false);
}
else {
tableCellEdited.setRendererValue(s, false);
setValueAt(tableCellEdited, getRowFromMat(tableCellEdited.getMat()), Integer.parseInt(temp.substring(6, 8)) );
}
clearProgrammazioneDueCaratteri();
}
}
repaint();
}
最简单的——不要调用它两次。
doSomething()
做什么?为什么焦点监听器和鼠标监听器都会调用它?我想知道我们是否在处理XY问题类型的问题,我们需要找出您试图引发的总体行为,因为您可能希望完全改变您的方法。我的JTable单元格包含可以由一个或两个字符组成的对象(长度为1或长度为2的字符串).因此,当用户写入第一个字符,然后在单元格外单击,或者在写入第二个字符之前在JTable组件外单击时,我需要应用setValueAt方法…这就是为什么我添加了一个focusListener和一个MouseStener…Andy,感谢您提供的信息--您能详细说明一下并告诉我们有关此e的更多细节吗xact问题?另外,请将这些信息作为问题的编辑,因为它太重要了,不能在评论中隐藏。再次感谢。