我的问题是:我有一个MATLAB GUI,如果我运行它以显示在我的GUI而不是命令窗口中,我想要得到的分析结果。我尝试使用列表框来显示结果,因为为列表框自动创建了滑块,但它不起作用。如何使用静态文本框显示数据?
答案 0 :(得分:8)
首先,您必须确保禁止输出到命令窗口。您可以通过确保使用semicolon结束行来完成此操作,避免使用DISP函数显示数据,并避免使用FPRINTF函数将数据发送到标准输出(即命令窗口)。
其次,确定您想要显示的“结果”类型。如果它是数值的向量或矩阵,您可能需要使用UITABLE对象而不是静态文本框(如Azim's answer to your other question中所述,并假设您有一个较新版本的MATLAB )。如果它只是几个数值,字符或字符串,那么我建议使用静态文本框。例如:
hList = uicontrol('Style','text','Position',[100 100 200 200]);
set(hList,'String',{'Line 1'; 'Line 2'}); % Displays 2 lines, one string each
vec = rand(3,1); % Column array of 3 random values
set(hList,'String',num2str(vec)); % Displays 3 lines, one number per line
使用此选项,您可能最终会使用string operations做很多事情。
注意:对于静态文本框,如果您在其中放入的文字多于它们能够显示的内容,则它们只会剪切文本。它们不会自动创建滑块来查看整段文本。您必须使静态文本框更大,将静态文本框的"FontSize" property调整为更小的值,或者(更复杂的选项)创建自己的滑块,该滑块将调整文本框中显示的内容
编辑:更复杂的选项......
如果有人感兴趣,我想我会包含一些示例代码,用于创建一个带有滑块的静态文本框,该滑块控制文本框中显示的内容。有很多不同的方法可以做到这一点,从我能想到的最简单的实现(下面给出)到使用nested functions和fancy OOP stuff的更复杂的版本。
首先,您必须将以下两个功能保存为m文件:
callback_scrolltext.m
function callback_scrolltext(source,event,hText)
textString = get(hText,'UserData');
nLines = numel(textString);
lineIndex = nLines-round(get(source,'Value'));
set(hText,'String',textString(lineIndex:nLines));
end
update_scrolltext.m
function update_scrolltext(newText,hText,hSlider)
newText = textwrap(hText,newText);
set(hText,'String',newText,'UserData',newText);
nRows = numel(newText);
if (nRows < 2),
sliderEnable = 'off';
else
sliderEnable = 'on';
end
nRows = max(nRows-1,1);
set(hSlider,'Enable',sliderEnable,'Max',nRows,...
'SliderStep',[1 3]./nRows,'Value',nRows);
end
其次,使用以下代码创建GUI对象。您可以将“位置”属性设置为您想要的任何属性,也可以使用图形或面板对象的任何句柄代替 hParent :
hParent = figure;
hText = uicontrol('Style','text',...
'Parent',hParent,...
'Units','pixels',...
'Position',[100 100 100 40]);
hSlider = uicontrol('Style','slider',...
'Parent',hParent,...
'Units','pixels',...
'Position',[200 100 10 40],...
'Enable','off',...
'Callback',{@callback_scrolltext,hText});
最后,每次要更改文本框的文本时,请使用要显示的文本调用 update_scrolltext (包含在单元格数组中,就像输入到{{3}的字符串一样} is)和文本框和滑块的句柄。以下是一些尝试的例子:
update_scrolltext({'hello'},hText,hSlider);
update_scrolltext({'hello'; 'there'; 'silly'; 'world'},hText,hSlider);
根据需要修改代码并享受! =)
答案 1 :(得分:2)
我使用listbox来显示命令输出就好了。我发现滚动条可以更好地查看输出而不会出现混乱。
假设状态是具有列表框样式的uicontrol的句柄;
message = 'New output to be appended';
set(status,'String', [message; get(status,'String')]);
为了实现这一点,我猜uicontrol的初始字符串应该是一个单元格,而不是字符串。您可以通过在两行上将uicontrol的字符串设置为“Ready”来确保这一点,或者您可以将字符串强制转换为这样的单元格:
set(status,'String', [message; {get(status,'String')}]);
答案 2 :(得分:1)
我通常只使用图形和文字,例如
figure(gcf)
text(offsetX1, offsetX1, ['result 1: ' num2str(result1)])
text(offsetX2, offsetX2, ['result 2: ' num2str(result2)])
现在我确信有更好的方法,但它对我来说效果很好, 即使你必须手动设计布局细节。
答案 3 :(得分:0)
我刚刚开始使用Matlab Gui,所以我绝不是任何专家,甚至没有经验 - 但是在另一个论坛中有人提到edit-text元素会自动生成滚动条?它还具有可选择和可复制的附加优势,我相信。如果我能弄清楚我的代码,我即将发现。我知道的时候我会回复。