我的Java代码存在问题。 我需要执行我的doSomething()方法,其中包括管理全局变量的代码。问题是该方法被调用两次(我的JTable的mouseEvent和focusEvent同时被触发)。 如何在一种互斥的情况下一次只执行一次doSomething()方法?
感谢。
addMouseListener (new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
doSomething();
}
});
addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e){
doSomething();
}
});
JTable单元格包含长度为1或2的String。 我需要应用setValue方法(或删除String),在用户停止单元格编辑或他写入2个字符的字符串的确切时刻。 通过这些监听器,我知道了执行setValue的确切时间,或者告诉用户他写的第一个字符不存在。所以这样我想阻止用户的行动。
换句话说,我需要控制用户输入才能执行setValue或删除它。 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();
}