我正在实现一个带有 IOConsole 的 Eclipse 插件,它从键盘接收输入并产生输出(IOConsoleInputStream、IOConsoleOutputStream)。我试图通过按照这里的建议扩展 TextConsoleViewer 将插入符号始终放在最后一个字符
问题是,当需要在打印输出后更改插入符号的位置时,由另一个线程写入的输出字符(由另一个引用输出流的线程)不计入控制台字符计数。
这是我的代码的链接
谢谢
我正在实现一个带有 IOConsole 的 Eclipse 插件,它从键盘接收输入并产生输出(IOConsoleInputStream、IOConsoleOutputStream)。我试图通过按照这里的建议扩展 TextConsoleViewer 将插入符号始终放在最后一个字符
问题是,当需要在打印输出后更改插入符号的位置时,由另一个线程写入的输出字符(由另一个引用输出流的线程)不计入控制台字符计数。
这是我的代码的链接
谢谢
的源代码setCaretOffset()
显示,如果您使用大于文本长度的偏移量,则使用文本长度代替,实际上是在文本末尾放置插入符号。因此,设置Integer.MAX_VALUE
为偏移量是一个可行的选项,无需对文本长度进行任何检查。
如果您无法收到有关刷新何时真正完成的通知,我建议您将插入符号的放置延迟几百毫秒。它不会分散用户的注意力,并为您提供强大的解决方案。
作为参考,这里是源代码setCaretOffset()
:
public void setCaretOffset(int offset) {
checkWidget();
int length = getCharCount();
if (length > 0 && offset != caretOffset) {
if (offset < 0) {
offset = 0;
} else if (offset > length) {
offset = length; // <-- use the length as offset
} else {
if (isLineDelimiter(offset)) {
// offset is inside a multi byte line delimiter. This is an
// illegal operation and an exception is thrown. Fixes 1GDKK3R
SWT.error(SWT.ERROR_INVALID_ARGUMENT);
}
}
setCaretOffset(offset, PREVIOUS_OFFSET_TRAILING);
// clear the selection if the caret is moved.
// don't notify listeners about the selection change.
if (blockSelection) {
clearBlockSelection(true, false);
} else {
clearSelection(false);
}
}
setCaretLocation();
}