I am attempting to declutter my MATLAB app code by separating some of the initialization into separate .m files. For this I have set up various files for each type of component (e.g. a file for buttons, graph, etc.). I am attempting to access a function in my master initialize file from the file for buttons. My code goes as follows in the buttons .m file goes as follow:
classdef buttons < handle
methods
%initializes the UI
function buttonCreate(app)
%Create file load 1
app.fileload1 = uibutton(app.gridLayout, 'push');
app.fileload1.FontSize = 36;
app.fileload1.Layout.Row = [8 9];
app.fileload1.Layout.Column = 1;
app.fileload1.Text = 'Load 1';
%proceeds to create the rest of the buttons
end
end
end
Now I attempt to access the buttonCreate()
function in my master initialize file initialize.m
:
classdef initialize < handle
properties
fig
gridLayout
axes
fileload1
end
methods
%initializes the UI
function init(app)
%create canvas
import buttons.*;
fig = uifigure;
fig.Position = [100 100 1920 1080];
movegui(fig,'center');
fig.Name = "Audio Editor";
%Create grid layout
gridLayout = uigridlayout(fig);
gridLayout.ColumnWidth = {'1x', '1x', '1x', '1x', '1x', '1x', '1x', '1x', '1x', '1x'};
gridLayout.RowHeight = {'1x', '1x', '1x', '1x', '1x', '1x', '1x', '1x', '1x', '1x', '1x', '1x', '1x', '1x', '1x', '1x', '1x', '1x', '1x', '1x', '1x'};
buttonCreate(app);
end
end
%code for calling and deleting
methods
%calls code to create canvas upon app start
function app = initialize
init(app)
end
%removes the app and deletes app.fig
function delete(app)
delete(app.fig);
end
end
end
Error in initialize/init (line 41)
buttonCreate(app);
^^^^^^^^^^^^^^^^^^
Error in initialize (line 54)
init(app)
^^^^^^^^^
This resulted in the UIFigure
still being created, but with no button and the terminal giving the error given above.
Seems like you're doing some sort of combination of two distinct things:
% in your initialise class constructor you still have
buttonCreate(app);
% In buttonCreate.m
function buttonCreate(app)
% Create file load 1
app.fileload1 = uibutton(app.gridLayout, 'push');
app.fileload1.FontSize = 36;
app.fileload1.Layout.Row = [8 9];
% ...
end
% in your initialise class constructor you create a buttons
% object and assign it to the buttons property.
% The buttons don't need to know anything about the app, just
% the target grid layout to parent the buttons
app.buttons = buttons( app.gridLayout );
% In buttons.m
classdef buttons < handle
properties
fileload1
end
methods
function obj = buttons( grid )
% Create file load 1
obj.fileload1 = uibutton(grid, 'push');
obj.fileload1.FontSize = 36;
obj.fileload1.Layout.Row = [8 9];
% ...
end
end
end