Java 在编辑器上绘图时冻结UI
我正在编写一个Eclipse插件,旨在使EclipseXML编辑器的行为类似于Java编辑器。所需的功能之一是突出显示所选区域(一个字、一行、一个字符…)的所有出现。只要处理小文件,这种方法就行 但是当我开始处理大文件(例如2000行代码)时,UI在处理突出显示所需的时间内冻结。这只需要1秒或更短的时间,但对用户来说可能非常刺激。这些“冻结”发生在我的侦听器被触发时,因此:Java 在编辑器上绘图时冻结UI,java,eclipse,Java,Eclipse,我正在编写一个Eclipse插件,旨在使EclipseXML编辑器的行为类似于Java编辑器。所需的功能之一是突出显示所选区域(一个字、一行、一个字符…)的所有出现。只要处理小文件,这种方法就行 但是当我开始处理大文件(例如2000行代码)时,UI在处理突出显示所需的时间内冻结。这只需要1秒或更短的时间,但对用户来说可能非常刺激。这些“冻结”发生在我的侦听器被触发时,因此: 输入已更改(添加或删除内容) 用户创建一个新的选择(他在文档的某个地方单击) 我当前启动突出显示过程的代码如下: tr
- 输入已更改(添加或删除内容)
- 用户创建一个新的选择(他在文档的某个地方单击)
try{
if (isValidContext(fText, input))
{
if (textSelection == null)
xmlH = new XMLHighlighter(fText, input);
else
xmlH = new XMLHighlighter(fText, input, textSelection);
Display.getDefault().asyncExec(new Runnable(){
@Override
public void run(){
try{
xmlH.highligth();
} catch (Exception e){
e.printStackTrace();
}
}
});
}
} catch (Exception e){
e.printStackTrace();
}
我认为运行一个新的Runnable将使这个操作完全独立于同时在UI中执行的其他操作。我错了吗
我认为这段代码是造成延迟的原因。也许你会不这么看
谢谢你的阅读
Display.asyncExec
尽快在UI线程中运行Runnable
。在这种情况下,当您已经在UI线程中时使用它并不能真正实现任何目标
您必须使用后台线程,或Eclipse作业
,或进度监视器对话框
或IProgressService。运行
或甚至CompleteableFuture
在后台运行长时间运行的代码。从后台使用Display.asynceec
更新UI
还要注意,Eclipse文本编辑器支持代码提供了一个非常复杂的系统,用于在后台进行语法高亮显示等操作。查看诸如
SourceViewerConfiguration
,IPresentationReconciler
,IPartitionTokenScanner
,IPresentationDamager
,iPresentationRepair
等内容。Eclipse“新建插件项目”向导甚至会使用这些类为您创建XML编辑器的大纲,例如。Display.asyncExec
尽快在UI线程中运行Runnable
。在这种情况下,当您已经在UI线程中时使用它并不能真正实现任何目标
您必须使用后台线程,或Eclipse作业
,或进度监视器对话框
或IProgressService。运行
或甚至CompleteableFuture
在后台运行长时间运行的代码。从后台使用Display.asynceec
更新UI
还要注意,Eclipse文本编辑器支持代码提供了一个非常复杂的系统,用于在后台进行语法高亮显示等操作。查看诸如
SourceViewerConfiguration
,IPresentationReconciler
,IPartitionTokenScanner
,IPresentationDamager
,iPresentationRepair
等内容。Eclipse“New Plug-in Project”向导甚至会使用这些类为您创建XML编辑器的大纲,作为示例之一。这里的东西不错。我可以解决输入更改(使用后台线程,让他调用Display.asyncExec
)造成的延迟,但当我尝试使用作业、ProgressMonitorDialog或IProgressService时,我遇到了一些问题,例如更多的延迟(IProgressSerie)或崩溃(作业)。我一直在努力,这里的东西不错。我可以解决输入更改(使用后台线程,让他调用Display.asyncExec
)造成的延迟,但当我尝试使用作业、ProgressMonitorDialog或IProgressService时,我遇到了一些问题,例如更多的延迟(IProgressSerie)或崩溃(作业)。我一直在努力。