へのハンドルである私は、回避策を見つけた
set(h, 'String', StrValue);
drawnow;
最後にフォーカスを要素に戻します。この解決策の欠点:テキスト全体がハイライト表示されます。また、解決策はやや脆弱です。明らかでない理由から、ダミー要素の可視性は、別のset
呼び出しで 'off'に設定する必要があります。
新しいコールバックは複数の行にまたがるため、匿名関数として指定することはできません。これは、最小限の例では、少し長くなります:
function caret_stuck_hack()
figure
hedit = uicontrol('Style', 'edit', 'String', '0', 'Callback', @edit_cb);
hdummy = uicontrol('Style', 'edit', 'String', 'dummy', ...
'Position', [0, 0, 1, 1]); % Position: HAS to be non-overlapping with other edit field
hdummy.Visible = 'off'; % Don't merge with upper line! HAS to be called seperately!
function edit_cb(h, e)
uicontrol(hdummy);
h.String = num2str(rand(1));
uicontrol(h);
drawnow;
end
end
結果:
補遺
あなたは、基礎となるのJava Swingのオブジェクトを操作することで、キャレットの位置を変更することができます。 Yair Altman's excellentfindjobj
機能を使用すると、コードは次のようになります。
function caret_stuck_hack()
figure
hedit = uicontrol('Style', 'edit', 'String', '0', 'Callback', @edit_cb);
hdummy = uicontrol('Style', 'edit', 'String', 'dummy', ...
'Position', [0, 0, 1, 1]); % Position: HAS to be non-overlapping with other edit field
hdummy.Visible = 'off'; % Don't merge with upper line! HAS to be called seperately!
jhedit = findjobj(hedit, 'nomenu');
function edit_cb(h, e)
caret_pos = get(jhedit, 'CaretPosition');
uicontrol(hdummy);
h.String = num2str(rand(1));
uicontrol(h);
drawnow;
set(jhedit, 'CaretPosition', caret_pos)
end
end
あなたは(そしておそらく必要があります)キャレットインデックスは違法ではないことを確認するために追加のコードを追加することができたときに、文字列の長さが変化します。しかし、この最小限例えば、結果はすでにかなり良さそうに見えます:
私はR2013a –