4

キーボードから入力を受け取り、出力 (IOConsoleInputStream、IOConsoleOutputStream) を生成する IOConsole を使用して Eclipse プラグインを実装しています。ここで提案されているように TextConsoleViewer を拡張することにより、キャレットを常に最後の文字に配置しようとしています

IOConsole のキャレットの設定方法

問題は、印刷出力後にキャレット位置を変更するときに、出力ストリームへの参照を持つ別のスレッドによって書き込まれた出力文字が、コンソールの文字数にカウントされないことです。

ここに私のコードへのリンクがあります

https://code.google.com/p/mdpm/source/browse/com.lowcoupling.mdpm.console/src/com/lowcoupling/mdpm/console/MDPMConsole.java

ありがとう

4

1 に答える 1

2

のソース コードは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();
}
于 2013-09-18T21:52:54.583 に答える