我正在尝试用 Java 制作自己的 IDE。在项目中,有一个 JTextArea 来编写代码,但我想正确处理缩进。
private void handleEnterKey() {
Document doc = getDocument();
int caretPosition = getCaretPosition();
if (isBetweenPairs(caretPosition)) {
try {
doc.insertString(caretPosition, "\n", null);
int indentLevel = 1;
StringBuilder indentation = new StringBuilder();
for (int i = 0; i < TAB_SIZE * indentLevel; i++) {
indentation.append(' ');
}
doc.insertString(caretPosition + 1, indentation.toString(), null);
setCaretPosition(getCaretPosition()-1);
} catch (BadLocationException ex) {
ex.printStackTrace();
}
}
}
在这里,如果我删除这一行:
setCaretPosition(getCaretPosition()-1);
文本区域看起来像这样:
currentline{
|}
所以我说退一步,但这并没有按预期工作,看起来像这样:
currentline{
|}
我解决了这个问题。 HandleEnterKey() 方法在实际的“Enter”键之前工作,用于移动下一行。因此,如果我说 setCaretPosition(getCaretPosition()-1),它会先向后移动,然后输入执行它自己的工作。
我使用 SwingUtilities.invokeLater(() -> handleEnterKey());问题就消失了。