在编辑器

时间:2016-05-11 13:43:00

标签: java eclipse

我正在编写一个Eclipse插件,旨在使Eclipse XML编辑器像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中同时执行的其他操作。我错了吗?

这段代码是我认为造成滞后的原因。也许你会看到它吗?

感谢阅读。

1 个答案:

答案 0 :(得分:3)

Display.asyncExec尽快在 UI主题中运行Runnable。当你已经在UI线程中时使用它在这种情况下并没有真正实现。

您必须使用后台线程,或Eclipse JobProgressMonitorDialogIProgressService.run甚至CompleteableFuture来在后台运行长时间运行的代码。使用后台代码中的Display.asyncExec更新用户界面。

另请注意,Eclipse文本编辑器支持代码提供了一个非常精细的系统,用于在后台进行语法突出显示等。查看SourceViewerConfigurationIPresentationReconcilerIPartitionTokenScannerIPresentationDamagerIPresentationRepairer等内容。 Eclipse' New Plug-in Project'向导甚至会为您使用这些类创建XML编辑器的大纲。作为示例之一。