处理Java中的并发事件

时间:2016-01-15 15:33:41

标签: java swing events jtable

我的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();
  }

0 个答案:

没有答案