【发布时间】:2018-04-24 03:47:57
【问题描述】:
我想在我的 GUI 中有一个文本框和一个按钮。按下按钮时,会出现一个历史记录窗口,如果用户选择之前的条目,他们在编辑框中突出显示的文本将被覆盖。
它应该像复制粘贴一样工作,在历史窗口中选择的任何内容都应该粘贴到所选内容上,或者应该在光标所在的任何位置添加新文本。
Matlab 中有没有办法做到这一点?是否可以访问编辑框中突出显示的内容?
【问题讨论】:
标签: matlab matlab-gui
我想在我的 GUI 中有一个文本框和一个按钮。按下按钮时,会出现一个历史记录窗口,如果用户选择之前的条目,他们在编辑框中突出显示的文本将被覆盖。
它应该像复制粘贴一样工作,在历史窗口中选择的任何内容都应该粘贴到所选内容上,或者应该在光标所在的任何位置添加新文本。
Matlab 中有没有办法做到这一点?是否可以访问编辑框中突出显示的内容?
【问题讨论】:
标签: matlab matlab-gui
使用 vanilla Matlab 这是不可能的。似乎 Mathworks 正在扩展他们对 GUI 的支持(survey 1、survey 2),但目前他们还不允许这样做。
一种可能的解决方法是使用findjobj.m, by Yair Altman。他讨论编辑框in this post
您可以为您的文本框跟踪 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
这将突出显示将被用户选择替换的文本
【讨论】: