Trying to build an app for user to define dimensions for a m*n grid that can tell the app to automatically make the dimensions of check boxes that were requested.

2 次查看(过去 30 天)
Hello,
I am currently trying to learn how the app program works on matlab and I am trying to figure out how to create an app in which the user can first define the matrix size of checkboxes that will then be displayed for the user to check or be left blank. The purpose of doing so is to convert these checkmarks into a 0/1 format into a matrix into my already written code. Also how would i bring my code into the app? I have a picture attatched for further explanation and any help at all will be greatly appreicated.

采纳的回答

Benjamin Großmann
编辑:Benjamin Großmann 2021-5-3
In app designer add two "edit field (numeric)", name the first one editN and the second one editM. Next, add a button, named "Button". And finally add a Table named UITable. Delete all table columns.
Now we have an app that should look like this:
I think the easiest approach is to generate a table of size (num_row x num_col) with logical data type. If you add this table as data to an uitable, then the checkboxes are automatically added since the datatype is logical.
Add a ButtonPushed Callback to your button and paste the following code.
function ButtonPushed(app, event)
n = app.editN.Value; % number of rows
m = app.editM.Value; % number of columns
% create a table with size [n,m] and all logical values
t = table( ...
'Size', [n,m], ...
'VariableTypes', repmat("logical", 1, m) ...
);
% add the table t as data to the uitable
app.UITable.Data =t;
% set the columns editable property to true
app.UITable.ColumnEditable = true;
% set the row and column name to 1 ... n ; 1 ... m
app.UITable.ColumnName = string(1:m);
app.UITable.RowName = string(1:n);
end
If you type in the size and push the button, checkboxes are added to the table:
You can access the data (check box status) pretty easy by app.UITable.Data or convert it to an array (logical matrix) via
logicalMatrix = table2array(app.UITable.Data)
If you do not want to use a table, you could also add checkboxes programmatically, (e.g. inside a loop), but here you have to take care of positions by yourself:
for ii = 1:n
for jj = 1:m
cb(ii, jj) = uicheckbox(app.UIFigure, 'Position', aPosition{ii, jj})
end
end
  3 个评论
Benjamin Großmann
编辑:Benjamin Großmann 2021-5-4
It depends on how your program looks like. Maybe an object oriented approach would be beneficial.
1) write a class that stores properties and methods for your task, the simplest form would be a class only containing the property "logicalMatrix" (please give this class a better name than I did)
% contents of MyClass.m
classdef MyClass < handle
properties
logicalMatrix
end
methods
function obj = MyClass()
end
end
end
2) Add a property "MyClass" as well as an App Input Argument "MyClass" to the app
3) Add a startup function to the app that takes the input and sets the corresponding property:
% Code that executes after component creation
function startupFcn(app, MyClass)
app.MyClass = MyClass;
end
4) Add a close request function that sets the table data to the property of the MyClass instance:
% Close request function: UIFigure
function UIFigureCloseRequest(app, event)
% get table data
data = app.UITable.Data;
% check if data is set (initially the data is empty)
if isempty(data) % if empty, write empty to logicalMatrix property and delete the app
app.baseClass.logicalMatrix = [];
delete(app)
else % if not empty, write data to logicalMatrix and delete the app
app.baseClass.logicalMatrix = table2array(data);
delete(app)
end
end
5) Write a program (e.g. script) that creates an instance of the class, calls the app and waits until the app is closed.
% Content of aScript.m
clearvars
close all
clc
% create instance of your handle class, one property is 'logicalMatrix'
myClassInstance = MyClass();
% start the app called "app1", pass the class instance and wait until the app is closed
uiwait(app1(myClassInstance).UIFigure)
% display the logical matrix
disp(myClassInstance.logicalMatrix)
Michael Cooley
Michael Cooley 2021-5-6
Thank you, I have been doing a lot of research on OOP due to your comment and it seems that you are right. It may take me a little bit of time to implement this correctly, but you have helped me out so much thank you!

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Software Development Tools 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by