How to display multiple calculated results in static text matlab GUI?

9 views (last 30 days)
Hi! I'm doing a project that able to get input from user and calculated multiple output and display in static text gui. When I run it it shows only the last line of result. For example I want the result look like this in static text gui :
(This is the result came out in command window when i using fprintf)
but it shows only the last line :
My code :
function varargout = hii(varargin)
% HII MATLAB code for hii.fig
% HII, by itself, creates a new HII or raises the existing
% singleton*.
%
% H = HII returns the handle to a new HII or the handle to
% the existing singleton*.
%
% HII('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in HII.M with the given input arguments.
%
% HII('Property','Value',...) creates a new HII or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before hii_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to hii_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help hii
% Last Modified by GUIDE v2.5 27-Mar-2022 21:12:43
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @hii_OpeningFcn, ...
'gui_OutputFcn', @hii_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before hii is made visible.
function hii_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to hii (see VARARGIN)
% Choose default command line output for hii
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes hii wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = hii_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
function edit1_Callback(hObject, eventdata, handles)
% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit1 as text
% str2double(get(hObject,'String')) returns contents of edit1 as a double
% --- Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit2_Callback(hObject, eventdata, handles)
% hObject handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit2 as text
% str2double(get(hObject,'String')) returns contents of edit2 as a double
% --- Executes during object creation, after setting all properties.
function edit2_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit3_Callback(hObject, eventdata, handles)
% hObject handle to edit3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit3 as text
% str2double(get(hObject,'String')) returns contents of edit3 as a double
% --- Executes during object creation, after setting all properties.
function edit3_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
Opening = str2double(get(handles.edit1, 'string'));
Yearly = str2double(get(handles.edit2, 'string'));
MonthlyP = str2double(get(handles.edit3, 'string'));
Months = 0;
balance = Opening;
while balance > MonthlyP
Monthly = (balance .* (Yearly ./ 12)) ./ 100;
PrincipalP = MonthlyP - Monthly;
Closing = balance - PrincipalP;
Months = Months + 1;
balance = Closing;
set(handles.text19, 'String', sprintf('%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t\n', Months, balance, MonthlyP, Monthly, PrincipalP, Closing));
end
if balance <= MonthlyP
Monthly = 0;
MonthlyP = balance;
PrincipalP = MonthlyP;
Closing = balance - PrincipalP;
set(handles.text19, 'String', sprintf('%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t\n', Months, balance, MonthlyP, Monthly, PrincipalP, Closing));
end

Accepted Answer

Voss
Voss on 27 Mar 2022
text19 only shows the last line of results because that's what you're setting its 'String' to be. If you want it to show all results, you need to append a new line of results to the 'String' each time you update it:
% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
Opening = str2double(get(handles.edit1, 'string'));
Yearly = str2double(get(handles.edit2, 'string'));
MonthlyP = str2double(get(handles.edit3, 'string'));
Months = 0;
balance = Opening;
while balance > MonthlyP
Monthly = (balance .* (Yearly ./ 12)) ./ 100;
PrincipalP = MonthlyP - Monthly;
Closing = balance - PrincipalP;
Months = Months + 1;
balance = Closing;
% set(handles.text19, 'String', sprintf('%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t\n', Months, balance, MonthlyP, Monthly, PrincipalP, Closing));
% get the current 'String' (it ends with a newline() \n):
old_string = get(handles.text19, 'String');
% append new stuff to it:
set(handles.text19, 'String', sprintf( ...
'%s%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t\n', ...
old_string, Months, balance, MonthlyP, Monthly, PrincipalP, Closing));
end
if balance <= MonthlyP
Monthly = 0;
MonthlyP = balance;
PrincipalP = MonthlyP;
Closing = balance - PrincipalP;
% set(handles.text19, 'String', sprintf('%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t\n', Months, balance, MonthlyP, Monthly, PrincipalP, Closing));
old_string = get(handles.text19, 'String');
set(handles.text19, 'String', sprintf( ...
'%s%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t%.2f\t\t\t\t\t\t\t\t\n', ...
old_string, Months, balance, MonthlyP, Monthly, PrincipalP, Closing));
end
(And if you want the columns of results to line up properly with the headers in your GUI, you can try to use fixed-width formats like '%30.4f' instead of a bunch of tabs in between numbers.)
But the best thing to do might be to use a uitable instead of one uicontrol for the headers and a separate uicontrol for the numbers.
  2 Comments
Lai Ken Siang
Lai Ken Siang on 27 Mar 2022
Thanks for the support. But there is still some problems. The output I get :
May I knw what did I do wrong? Is it do anything with the properties of uicontrol or the text formatting?
The changes I have made :
% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
Opening = str2double(get(handles.edit1, 'string'));
Yearly = str2double(get(handles.edit2, 'string'));
MonthlyP = str2double(get(handles.edit3, 'string'));
Months = 0;
while Opening > MonthlyP
Monthly = (Opening .* (Yearly ./ 12)) ./ 100;
PrincipalP = MonthlyP - Monthly;
Closing = Opening - PrincipalP;
Months = Months + 1;
% get the current 'String' (it ends with a newline() \n):
old_string = get(handles.text19, 'String');
% append new stuff to it:
set(handles.text19, 'String', sprintf( ...
'%s%d\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n', ...
old_string, Months, Opening, MonthlyP, Monthly, PrincipalP, Closing));
Opening = Closing;
if Opening <= MonthlyP
Monthly = 0;
MonthlyP = Opening;
PrincipalP = MonthlyP;
Closing = Opening - PrincipalP;
old_string = get(handles.text19, 'String');
set(handles.text19, 'String', sprintf( ...
'%s%d\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n', ...
old_string, Months, Opening, MonthlyP, Monthly, PrincipalP, Closing));
end
end
Voss
Voss on 27 Mar 2022
Please recall the last couple of sentences of my answer:
"(And if you want the columns of results to line up properly with the headers in your GUI, you can try to use fixed-width formats like '%30.4f' instead of a bunch of tabs in between numbers.)
But the best thing to do might be to use a uitable instead of one uicontrol for the headers and a separate uicontrol for the numbers."
Here's an example to show why trying to use (any number of) tabs between numbers will not get the numbers to line up (in general), when the format specifier is not fixed-width:
fprintf('%.2f\t%.2f\n%.2f\t%.2f\n',14512,2,3.3,4.4)
14512.00 2.00 3.30 4.40
There is one tab between the two numbers on each line, but because the first number on the first line (14512) takes up more space than the first number on the second line (3.3), the second column of numbers does not line up.
This will be a potential problem any time you are using a format like '%.2f' instead of specifying a field width that is guaranteed to be wide enough for your numbers (that is, the width is fixed), e.g., '%30.2f' (at least 30 characters wide total, with 2 characters to the right of the decimal).
(It doesn't have to do with the tabs or how many tabs you have; I only mentioned the tabs because the tabs seemed like an attempt to get nicely-spaced columns.)
I'm actually not sure if that's the only thing going on here though. You seem to get '.' in place of some numbers in your text 'String', and I'm not sure why. The formats seem ok as shown in your code:
fprintf('%s%d\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n','',1,2,3,4,5,6)
1 2.00 3.00 4.00 5.00 6.00
But the output makes it look like there is an extra decimal and tab somewhere:
fprintf('%s%d\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t.\n','',1,2,3,4,5,6)
1 2.00 3.00 4.00 5.00 6.00 .
In any case, try to see how it looks with formats like
'%s%10d\t%30.2f\t%30.2f\t%30.2f\t%30.2f\t%30.2f\n'
and adjust the widths (10, 30, 30, etc.) as necessary.
Also, it will be necessary to use a fixed-width font for text19, which you can do by setting the FontName of text19 to 'FixedWidth'
(And I maintain that using a uitable is the best choice here - no string formats to worry about at all, and the header text and columns of data will always line up.)

Sign in to comment.

More Answers (0)

Categories

Find more on Migrate GUIDE Apps in Help Center and File Exchange

Tags

Products


Release

R2021b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!