如何确保java丢失焦点事件处理程序在执行另一个事件处理程序之前完成其工作

时间:2012-10-18 05:51:26

标签: java swing

我正在将语音识别组件与我现有的应用程序集成。在我的应用程序中,我有一个JTree和JTextPane。我为jreepane和JTree的选择事件处理程序编写了丢失的焦点事件处理程序。当焦点位于jtextpane中然后在jtree中选择一个节点时,我可以看到在焦点丢失事件处理程序之前,执行了选择事件处理程序。我在焦点丢失事件处理程序中编写了ThreadPoolExecutor,并且我向ThreadPoolExecutor添加了三个作业,我必须保证在执行选择处理程序之前我应该​​完成ThradPoolExecutor中的所有作业;因为我有使用countdownlatch。我已经阅读了许多类似的帖子,但我无法找到如何确保在执行选择事件处理程序之前完成焦点丢失。有些帖子要求在invokeLater方法中运行选择事件处理程序代码。但它不是我的问题的解决方案,因为ThreadPoolExecutor在另一个线程中执行其代码。下面我记下了我想要执行代码的序列

  1. 在焦点丢失事件处理程序
  2. 中向ThreadPoolExecutor添加作业
  3. 阻止UI线程并在丢​​失焦点事件中完成所有添加的作业到ThreadPoolExecutor。
  4. 执行选择事件处理程序。
  5. 下面是我的焦点处理程序的代码

    public void focusLost(FocusEvent e)
      {
    
        if (ecaControl.isInitialized())
        {
    
          ecaControl.addStopRecordingJobToExecutor();
    
          ecaControl.addSaveJobToExecutor(this.currentMetaFileName != null ? this.currentMetaFileName : this.getName());
    
          ecaControl.addCloseJobToExecutor();
    
          co = new CountDownLatch(ecaControl.getExecutor().counter);
          ecaControl.getExecutor().setCountdownla(co);
    
          try
          {
            System.out.println("------- count before" + ecaControl.getExecutor().counter);
            co.await();
    
            ecaControl.getExecutor().setCountdownla(null);
          }
          catch (InterruptedException e1)
          {
            // TODO Auto-generated catch block
            e1.printStackTrace();
          }
          System.out.println("--------count after" + ecaControl.getExecutor().counter);
          try
          {
            System.out.println("The text is "
                + this.getStyledDocument().getText(0, getStyledDocument().getLength()));
          }
          catch (BadLocationException e1)
          {
            // TODO Auto-generated catch block
            e1.printStackTrace();
          }
    
        }
    
      }
    

1 个答案:

答案 0 :(得分:0)

如果选择事件仅与focusLost()事件同时发生,那么您应该致电ThreadPoolExecutor上的awaitTermination(),然后在选择中调用invokeLater()方法事件。如果没有,那么最好的解决方案可能是事件调度员。如果您将所有事件发送到事件调度程序,它可以协调JTree是否需要等待,执行所需的任何线程,然后在适当的时间将事件重新分派给适当的组件。