编辑器组件
编辑器组件
和java原生 Swing JTextArea 相比,IntelliJ Platform的 EditorTextField 编辑器的有语法高亮、代码补全,代码折叠等优势。
编辑器通常显示在编辑器选项卡中,也可以嵌入对话框和工具窗口中。
EditorTextField 有以下属性:
解析文本字段中的文本所依据的文件类型;
文本字段是否是只读,是否能编辑
文本字段是单行还是多行的
可以通过 EditorCustomization 的子类重写 createEditor()
可以通过重写EditorTextField 子类的中的 **createEditor()方法 ,在createEditor()**方法通过 EditorCustomization 进一步自定义编辑器
下面是一些常用的 EditorCustomization实现类:
SpellCheckingEditorCustomization 可以禁用拼写检查
ErrorStripeEditorCustomization 开、关编辑器右边的错误条纹
EditorTextField 有很多提供其它功能的子类
如果想在对话框中使用一个输入框编辑器,可以考虑LanguageTextField ,它提供了方便操作的API
如果想在编辑器中增加自动补全功能,可以使用 TextFieldWithCompletion ,可能通过它的带 TextCompletionProvider 参数的构造器提供自动补全功能。
如果想实现自己的自动补全组件,可以继承 TextFieldCompletionProvider ,重写 addCompletionVariants() 方法,然后使用CompletionResultSet.addElement() 添加入自动补全工具集
在创建索引阶段,可以通过 TextFieldCompletionProviderDumbAware 查看自动补全情况
Refer to the Code Completion to learn more about completion.
可以在 代码补全 文档中查看更多
Java
使用EditorTextField一个常用的例子: 是输入Java的类名或包名,需要通过以下几步:
- 使用 JavaCodeFragmentFactory.createReferenceCodeFragment() 创建类名或包名的代码片段
- 通过 PsiDocumentManager.getDocument() 获取代码片段对应的文档;
- 在new EditorTextField (document) 时传入返回的 document,或者使用 EditorTextField的 setDocument() 方法
PsiFile psiFile = PsiDocumentManager.getInstance(project)
.getPsiFile(editor.getDocument());
PsiElement element = psiFile.findElementAt(editor.getCaretModel().getOffset());
PsiExpressionCodeFragment code =
JavaCodeFragmentFactory.getInstance(project)
.createExpressionCodeFragment("", element, null, true);
Document document =
PsiDocumentManager.getInstance(project).getDocument(code);
EditorTextField myInput =
new EditorTextField(document, project, JavaFileType.INSTANCE);
提示
当创建多个字段的时候,需要两个单独的文档。所以使用了单独的 PsiExpressionCodeFragment 实例来实现的。
没有使用 setText() 方法,使用了 createExpressionCodeFragment() 方法,把文本当做参数传了过去。
构建GUI 时, 可以通过在 IDE 中右键单击把 JTextField 实例 替换为自定义组件。确保使用“Custom Create”,初始化代码才能正常工作。