Editor Components
EditorTextField
Compared to
Swing JTextArea
, the
IntelliJ Platform’s editor component has a ton of advantages: syntax highlighting support, code completion, code folding and much more.
IntelliJ Platform editors are normally displayed in editor tabs, but they can be embedded in dialogs or tool windows, too.
This is enabled by the
EditorTextField
component.
When creating an
EditorTextField
,
you can specify the following attributes:
-
The file type according to which the text in the text field is parsed;
-
Whether the text field is read-only or editable;
-
Whether the text field is single-line or multiline.
A common use case for
EditorTextField
is entering the name of a Java class or package.
This can be accomplished with the following steps:
-
Use
JavaCodeFragmentFactory.getInstance().createReferenceCodeFragment()
to create a code fragment representing the class or package name; -
Call
PsiDocumentManager.getInstance().getDocument()
to get the document corresponding to the code fragment; -
Pass the returned document to the
EditorTextField
constructor or itssetDocument()
method.
E.g.:
PsiFile psiFile = PsiDocumentManager.getInstance(editor.getProject()).getPsiFile(editor.getDocument());
PsiElement element = psiFile.findElementAt(editor.getCaretModel().getOffset());
PsiExpressionCodeFragment code = JavaCodeFragmentFactory.getInstance(editor.getProject()).createExpressionCodeFragment("", element, null, true);
Document document = PsiDocumentManager.getInstance(editor.getProject()).getDocument(code);
EditorTextField myInput = new EditorTextField(document, editor.getProject(), JavaFileType.INSTANCE);
TIPS:
-
When creating more than one field you need two separate documents. This is accomplished by using separate instances of the
PsiExpressionCodeFragment
-
setText
no longer works for the input field. However, thecreateExpressionCodeFragment
accepts the text fore the field as an argument. As such you can replace the empty string and create a new document in leau ofsetText()
-
You can replace instances of
JTextField
in the GUI builder with custom replace using the right click in your IDE. Make sure to use “Custom Create” so you can set the initialization code properly