2016-07-13 3 views
1

the programmatic approachを使用してGUIを構築しています(GUIDEとAppDesignerを除く)。 私のGUIには、特定の入力のみを受け付ける編集フィールドが含まれています。したがって、私は入力を消毒し、それに応じて編集フィールドのStringプロパティを更新するコールバックを使用しています。しかし、Stringプロパティを更新すると、キャレット(「カーソル」)が詰まってしまいます。点滅が止まりますが、左右に移動することはできますが、入力の左端にゴーストコピーが残っています。 (win7の上、使用してMatlab2016aまたはMatlab2014b)"編集"フィールドの文字列プロパティを設定するときにキャレットがスタックされました

figure; 
edit_cb = @(h, e) set(h, 'String', num2str(rand(1))); 
uicontrol('Style', 'edit', 'String', '0', 'Callback', edit_cb); 

結果:

最小作業例、使用して乱数

enter image description here

私はwihtoutフィールド内の文字列を更新するにはどうすればよいですキャレットを埋め込むgつまった?

+0

私はR2013a –

答えて

0

へのハンドルである私は、回避策を見つけた

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 

結果:

enter image description here

補遺

あなたは、基礎となるの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 

あなたは(そしておそらく必要があります)キャレットインデックスは違法ではないことを確認するために追加のコードを追加することができたときに、文字列の長さが変化します。しかし、この最小限例えば、結果はすでにかなり良さそうに見えます:

enter image description here

0

setを使用して値を更新し、次にdrawnowを使用して強制的にuicontrolをリフレッシュしてください。コールバックでは、最初の要素の関心を更新し、ダミーの要素にフォーカスを切り替えることができ、そして:hはあなたのUicontrol

+0

にこの問題が発生していない奇妙だというのが私のコールバックをやっている正確に何ということはないですか?私はコールバックの外でそれを行うことができることを知っていますが、私の目標はユーザの入力を消毒することなので、それは無意味です。 –

+0

'drawnow'を使ってuicontrolを強制的にリフレッシュしてみてください –

+0

残念ながら、' drawnow'は助けになりません。 –

関連する問題