我希望在GUI中有一个文本框和一个按钮。按下按钮时,将出现一个历史记录窗口,如果用户选择了以前的条目,则他们在编辑框中突出显示的文本将被覆盖。
它应该像复制粘贴一样工作,无论在历史窗口中选择什么,都应该粘贴在所选内容上,或者新文本应该添加到光标所在的位置。
在Matlab中有什么方法可以做到这一点吗?是否可以访问编辑框中突出显示的内容?
使用普通的Matlab,这是不可能的。Mathworks似乎正在扩展他们对GUI的支持(调查1、调查2),但到目前为止,他们还不允许这样做。
一个可能的解决方法是使用亚伊尔·奥特曼的findjobj.m。他在这篇文章中讨论了编辑框
您可以为您的文本框跟踪findjobj.m,以找到所需的1或2行代码,这样您就不必携带全部3400行代码。
然后,你真正需要做的就是获得选定的索引并从那里开始工作。
javaHandle = findjobj(editBoxHandle);
startSelect = get(javaHandle,'SelectionStart');
endSelect = get(javaHandle,'SelectionEnd');
一旦有了所选文本的索引,用新文本替换该文本几乎就变得微不足道了。
text = editBoxHandle.String;
editBoxHandle.String = [text(1:startSelect) newText text(endSelect:end)];
需要注意的一点是,当用户单击按钮时,文本框将失去焦点,并且将不再清楚所选的文本。您可以通过将焦点放回文本框,然后重新选择按钮回调中选择的内容来解决此问题。
uicontrol(editBoxHandle); %Give focus to the edit box, selecting the entire text
javaHandle.select(startSelect,endSelect); %select/highlight the correct stuff
这将突出显示将被用户选择替换的文本