Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.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 在编辑器上绘图时冻结UI_Java_Eclipse - Fatal编程技术网

Java 在编辑器上绘图时冻结UI

Java 在编辑器上绘图时冻结UI,java,eclipse,Java,Eclipse,我正在编写一个Eclipse插件,旨在使EclipseXML编辑器的行为类似于Java编辑器。所需的功能之一是突出显示所选区域(一个字、一行、一个字符…)的所有出现。只要处理小文件,这种方法就行 但是当我开始处理大文件(例如2000行代码)时,UI在处理突出显示所需的时间内冻结。这只需要1秒或更短的时间,但对用户来说可能非常刺激。这些“冻结”发生在我的侦听器被触发时,因此: 输入已更改(添加或删除内容) 用户创建一个新的选择(他在文档的某个地方单击) 我当前启动突出显示过程的代码如下: tr

我正在编写一个Eclipse插件,旨在使EclipseXML编辑器的行为类似于Java编辑器。所需的功能之一是突出显示所选区域(一个字、一行、一个字符…)的所有出现。只要处理小文件,这种方法就行

但是当我开始处理大文件(例如2000行代码)时,UI在处理突出显示所需的时间内冻结。这只需要1秒或更短的时间,但对用户来说可能非常刺激。这些“冻结”发生在我的侦听器被触发时,因此:

  • 输入已更改(添加或删除内容)
  • 用户创建一个新的选择(他在文档的某个地方单击)
我当前启动突出显示过程的代码如下:

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)或崩溃(作业)。我一直在努力。