私の問題はこれです:私はMATLAB GUIを持っていて、それを実行した場合に得られる分析結果をコマンドウィンドウではなくGUIに表示したいと思っています。リストボックス用にスライダーバーが自動的に作成されるため、リストボックスを使用して結果を表示しようとしましたが、機能しませんでした。おそらく静的テキストボックスを使用して、データを表示するにはどうすればよいですか?
4 に答える
まず、コマンド ウィンドウへの出力を抑制する必要があります。これを行うには、行を必ずセミコロンで終了し、DISP関数を使用してデータを表示しないようにし、FPRINTF関数を使用してデータを標準出力 (コマンド ウィンドウ) に送信しないようにします。
次に、表示する「結果」の種類を決定します。それが数値のベクトルまたは行列である場合は、静的テキスト ボックスの代わりにUITABLEオブジェクトを使用することをお勧めします (他の質問に対する Azim の回答で提案されているように、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
このオプションを使用すると、おそらく文字列操作で多くのことを行うことになります。
注:静的テキスト ボックスでは、表示できるよりも多くのテキストを入力すると、単にテキストが切り取られます。テキスト全体を表示するためのスライダーを自動的に作成するわけではありません。静的テキスト ボックスを大きくするか、静的テキスト ボックスの"FontSize" プロパティをより小さい値に調整するか、(より複雑なオプション) テキスト ボックスに表示される内容を調整する独自のスライダーを作成する必要があります。
編集:より複雑なオプション...
興味のある方のために、テキスト ボックスに表示されるコンテンツを制御するスライダーを備えた静的テキスト ボックスを作成するためのサンプル コードを含めたいと思います。これを行うには、私が考えることができる最も単純な実装 (以下に示す) から、ネストされた関数と派手な OOPを使用したより複雑なバージョンまで、さまざまな方法があります。
まず、次の 2 つの関数を 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 オブジェクトを作成します。'Position' プロパティを好きなように設定したり、図またはパネル オブジェクトの任意のハンドルを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});
最後に、テキスト ボックスのテキストを変更するたびに、表示するテキスト ( TEXTWRAPへの文字列入力と同様にセル配列に含まれる) と、テキスト ボックスとスライダーのハンドルを指定してupdate_scrolltextを呼び出します。以下にいくつかの例を示します。
update_scrolltext({'hello'},hText,hSlider);
update_scrolltext({'hello'; 'there'; 'silly'; 'world'},hText,hSlider);
必要に応じてコードを変更して楽しんでください。=)
リストボックスを使用して、コマンド出力をうまく表示します。スクロール バーを使用すると、出力が乱雑になることなく見やすくなることがわかりました。
status がリストボックスのスタイルを持つ uicontrol へのハンドルであると仮定します。
message = 'New output to be appended';
set(status,'String', [message; get(status,'String')]);
これが機能するためには、uicontrol の最初の文字列は文字列ではなくセルである必要があると思います。これを確認するには、uicontrol の文字列を 2 行で 'Ready' にするか、次のように文字列をセルに強制することができます。
set(status,'String', [message; {get(status,'String')}]);
私は通常、図とテキストを使用するだけです。
figure(gcf)
text(offsetX1, offsetX1, ['result 1: ' num2str(result1)])
text(offsetX2, offsetX2, ['result 2: ' num2str(result2)])
今日ではもっと良い方法があると確信していますが、レイアウトの詳細を手動で設計する必要がありますが、私にとってはうまくいきます。
私はMatlabGuiを使い始めたばかりなので、決して専門家でも経験者でもありませんが、別のフォーラムで、edit-text要素が自動的にスクロールバーを生成すると誰かが言及しましたか?また、選択可能でコピー可能であるという追加の利点もあると思います。私は自分のコードを理解できるかどうかを調べようとしています。わかったら投稿します。