我正在将语音识别组件与我现有的应用程序集成。在我的应用程序中,我有一个JTree和JTextPane。我为jreepane和JTree的选择事件处理程序编写了丢失的焦点事件处理程序。当焦点位于jtextpane中然后在jtree中选择一个节点时,我可以看到在焦点丢失事件处理程序之前,执行了选择事件处理程序。我在焦点丢失事件处理程序中编写了ThreadPoolExecutor,并且我向ThreadPoolExecutor添加了三个作业,我必须保证在执行选择处理程序之前我应该完成ThradPoolExecutor中的所有作业;因为我有使用countdownlatch。我已经阅读了许多类似的帖子,但我无法找到如何确保在执行选择事件处理程序之前完成焦点丢失。有些帖子要求在invokeLater方法中运行选择事件处理程序代码。但它不是我的问题的解决方案,因为ThreadPoolExecutor在另一个线程中执行其代码。下面我记下了我想要执行代码的序列
下面是我的焦点处理程序的代码
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();
}
}
}
答案 0 :(得分:0)
如果选择事件仅与focusLost()
事件同时发生,那么您应该致电ThreadPoolExecutor
上的awaitTermination()
,然后在选择中调用invokeLater()
方法事件。如果没有,那么最好的解决方案可能是事件调度员。如果您将所有事件发送到事件调度程序,它可以协调JTree
是否需要等待,执行所需的任何线程,然后在适当的时间将事件重新分派给适当的组件。