Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 设置“字符串”属性时插入符号卡住;编辑";领域_Matlab_Matlab Gui - Fatal编程技术网

Matlab 设置“字符串”属性时插入符号卡住;编辑";领域

Matlab 设置“字符串”属性时插入符号卡住;编辑";领域,matlab,matlab-gui,Matlab,Matlab Gui,我正在用Matlab构建一个GUI(没有AppDesigner,没有指南)。 我的GUI包含一个编辑字段,该字段应仅接受某些输入。因此,我使用一个回调来清理输入,然后相应地更新编辑字段的String属性。但是,当我更新字符串属性时,插入符号(“光标”)会被卡住:它停止闪烁,尽管您仍然可以左右移动它,但它的重影副本将保持在输入的左边缘 使用随机数的最小工作示例: figure; edit_cb = @(h, e) set(h, 'String', num2str(rand(1))); uicont

我正在用Matlab构建一个GUI(没有AppDesigner,没有指南)。 我的GUI包含一个编辑字段,该字段应仅接受某些输入。因此,我使用一个回调来清理输入,然后相应地更新编辑字段的String属性。但是,当我更新字符串属性时,插入符号(“光标”)会被卡住:它停止闪烁,尽管您仍然可以左右移动它,但它的重影副本将保持在输入的左边缘

使用随机数的最小工作示例:

figure;
edit_cb = @(h, e) set(h, 'String', num2str(rand(1)));
uicontrol('Style', 'edit', 'String', '0', 'Callback', edit_cb);
结果(在Win7上,使用Matlab2016a或Matlab2014b):


如何更新字段内的字符串而不使插入符号卡住?

尝试使用
set
更新值,然后使用
drawnow
强制刷新uicontrol

set(h, 'String', StrValue);
drawnow;

其中,
h
是您的uicontrol的句柄

尝试使用
设置
更新值,然后使用
drawnow
强制刷新uicontrol

set(h, 'String', StrValue);
drawnow;

其中,
h
是您的uicontrol的句柄

我找到了一个解决方法:在回调中,您可以首先将焦点切换到虚拟元素,然后更新感兴趣的元素,最后将焦点切换回感兴趣的元素。此解决方案的缺点是:文本整体高亮显示。此外,解决方案有些复杂易碎:由于不明显的原因,必须在单独的
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对象来更改插入符号的位置。使用
findjobj
函数,代码变为:

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
您可以(也可能应该)添加额外的代码来检查插入符号索引在字符串长度更改时是否非法。但是对于这个最小的示例,结果已经非常好了:


我找到了一个解决方法:在回调中,您可以首先将焦点切换到虚拟元素,然后更新感兴趣的元素,最后将焦点切换回感兴趣的元素。此解决方案的缺点:文本整体突出显示。此外,解决方案有些脆弱:由于不明显的原因,文本的可见性必须在单独的
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对象来更改插入符号的位置。使用
findjobj
函数,代码变为:

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
您可以(也可能应该)添加额外的代码来检查插入符号索引在字符串长度更改时是否非法。但是对于这个最小的示例,结果已经非常好了:


这不正是我的回调正在做的吗?我知道我可以在回调之外做,但那将是毫无意义的,因为我的目标是清理用户输入。还可以尝试使用
drawnow
强制刷新uicontrol。不幸的是,
drawnow
没有帮助。我可以在Matlab2016a runn下重现您的问题在Linux上刷新。刷新时可能是一个错误。实际上,如果你向右移动光标,然后将其移回左侧,然后再向右移动,幽灵光标将正确地消失并得到正确的刷新。这不正是我的回调所做的吗?我知道我可以在回调之外执行此操作,但这将是毫无意义的,因为我的目标是清理用户输入。还可以尝试使用
drawnow
强制刷新uicontrol。不幸的是,
drawnow
没有帮助。我可以在Linux上运行的Matlab2016a下重现您的问题。刷新时可能是一个错误。实际上,如果向右移动光标,则将其移回左侧并向右移动幽灵光标是否正确地消失并得到正确的刷新。这很奇怪,我在R2013a上没有遇到这个问题。这很奇怪,我在R2013a上没有遇到这个问题