matlabfileuser-interfacematlab-figure

How do I access a MATLAB UI function in another .m file?


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.


Solution

  • Seems like you're doing some sort of combination of two distinct things:

    1. Use a simple function, which can be in its own .m file or one of the methods of your main class:
    % 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
    
    1. Use a class to hold references to all of your buttons, in which case the objects you create would be properties of that class, rather than the main app object:
    % 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