ich eine Abhilfe gefunden: In der Callback, können Sie zunächst den Fokus auf ein Dummy-Element wechseln, aktualisieren Sie dann das Element-of-Interest, und Schalte schließlich den Fokus zurück auf das Element von Interesse. Nachteil dieser Lösung: Der Text ist in seiner Gesamtheit hervorgehoben. Außerdem ist die Lösung etwas fragil: Aus nicht naheliegenden Gründen muss die Sichtbarkeit des Dummy-Elements in einem separaten set
-Aufruf auf "aus" gesetzt werden.
Da der neue Rückruf mehrere Zeilen umfasst, kann er nicht mehr als anonyme Funktion angegeben werden. Dies macht die minimale Beispiel etwas länger:
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
Ergebnis:

Nachtrag
Sie können die Position des Cursors ändern, indem die zugrunde liegenden Java Swing-Objekt zu manipulieren. Mit Yair Altman's excellentfindjobj
Funktion wird der Code:
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
Sie könnten (und vielleicht sollten) in zusätzlichen Code zu überprüfen, ob der caret Index nicht illegal ist, wenn die Länge der Zeichenfolge ändert. Aber für dieses minimal Beispiel sieht das Ergebnis schon recht nett:

dass seltsam ich dieses Problem nicht auf R2013a begegne –