Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中处理并发事件_Java_Swing_Events_Jtable - Fatal编程技术网

在Java中处理并发事件

在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

我的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的字符串。 我需要应用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问题?另外,请将这些信息作为问题的编辑,因为它太重要了,不能在评论中隐藏。再次感谢。