我想在我的 GUI 中有一个文本框和一个按钮。按下按钮时,将出现一个历史记录窗口,如果用户选择以前的条目,他们在编辑框中突出显示的文本将被覆盖。
它应该像复制粘贴一样工作,在历史窗口中选择的任何内容都应该粘贴在所选内容上,或者应该在光标所在的任何位置添加新文本。
Matlab中有没有办法做到这一点?是否可以访问编辑框中突出显示的内容?
我想在我的 GUI 中有一个文本框和一个按钮。按下按钮时,将出现一个历史记录窗口,如果用户选择以前的条目,他们在编辑框中突出显示的文本将被覆盖。
它应该像复制粘贴一样工作,在历史窗口中选择的任何内容都应该粘贴在所选内容上,或者应该在光标所在的任何位置添加新文本。
Matlab中有没有办法做到这一点?是否可以访问编辑框中突出显示的内容?
使用香草 Matlab 这是不可能的。似乎 Mathworks 正在扩展他们对 GUI 的支持(调查 1、调查 2),但到目前为止他们还不允许这样做。
一种可能的解决方法是使用Yair Altman 的 findjobj.m。他在这篇文章中讨论了编辑框
您可以为您的文本框跟踪 findjobj.m 以查找所需的 1 或 2 行代码,因此您不必携带所有 3,400 行代码。
然后,您真正需要做的就是获取选定的索引并从那里开始工作。
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
这将突出显示将被用户选择替换的文本