Remove programmatically added checkboxes and replace them with new checkboxes

I am working on an app that dynamically adds checkboxes based on the data loaded to a panel. I want to replace the checkboxes with new checkboxes with different names depending on the file I load.
The data loaded here are the names of the files in a given folder to populate a set of checkboxes, whose number can vary.
How do I then remove the checkboxes when I load a different set of files?
names=dir('*train*.mat');% identify files with 'train' in name
r={names(:).name}.'; % Create an cell structure of names
StrErase=["Train","Validation","train","validation","ing"]; % erase parts of the string
% Load Posture data and names
for i=1:length(r)
str=replace(erase(r(i),".mat"),'_',' '); % remove the file extension from the name
app.Postcbx{i}=uicheckbox('Parent',app.PosturesPanel,"Value",1,'Position',...
[10 (330-20*i) 150 15],'Text',erase(str,StrErase)); % Create the checkboxes
end

댓글 수: 3

Okay. You explained, what you want to do and posted some code. What is your question?
I want to remove the checkboxes when I load a new set of files.
What about:
delete(app.Postcbx)
or if they are really defined as cell elements:
delete([app.Postcbx{:}])

댓글을 달려면 로그인하십시오.

 채택된 답변

Voss
Voss 2022년 5월 4일
편집: Voss 2022년 5월 5일
names=dir('*train*.mat');% identify files with 'train' in name
r={names(:).name}.'; % Create an cell structure of names
StrErase=["Train","Validation","train","validation","ing"]; % erase parts of the string
n_old = numel(app.Postcbx);
n_new = numel(r);
if n_old > n_new
% delete any old checkboxes you don't need
delete([app.Postcbx{n_new+1:n_old}]);
app.Postcbx(n_new+1:n_old) = [];
elseif n_old < n_new
% create any new checkboxes you need
for i = n_old+1:n_new
app.Postcbx{i}=uicheckbox('Parent',app.PosturesPanel);
end
end
% update the Position, Text, and Value of all checkboxes
for i = 1:n_new
str=replace(erase(r(i),".mat"),'_',' '); % remove the file extension from the name
app.Postcbx{i}.Position = [10 (330-20*i) 150 15];
app.Postcbx{i}.Text = erase(str,StrErase);
app.Postcbx{i}.Value = 1;
end

댓글 수: 3

Thank you for your help. I used the code you suggested, however the text did not update the way I hoped.
I was able to use the delete function to erase the previous list and replace it with a whole new list.
Voss
Voss 2022년 5월 5일
편집: Voss 2022년 5월 5일
Perhaps those checkboxes that persisted were not stored in app.Postcbx? Hard to say without seeing more of the app code.
In general, it should be feasible to delete/create objects as needed, without having to delete all and then create a new set each time the set changes.
EDIT: Actually, I just made a modification to my answer. Try it like it is now, and see if that works, if you're still planning to use checkboxes as opposed to some other type of component.
Stephen
Stephen 2022년 5월 5일
편집: Stephen 2022년 5월 5일
I wasn't able to re-write the text on the checkboxes using this method. I ended up using this
if numel(app.Postcbx)>0
delete([app.Postcbx{:}]);
end
and making new checkboxes each time I open a new data folder.
Thanks!

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Steven Lord
Steven Lord 2022년 5월 4일
Are you sure you want to use an unknown number of checkboxes? If there are a large number of files perhaps a CheckBoxTree (uitree) or a ListBox (uilistbox) might be a better solution.

카테고리

도움말 센터File Exchange에서 Debugging and Analysis에 대해 자세히 알아보기

제품

릴리스

R2022a

질문:

2022년 5월 4일

편집:

2022년 5월 5일

Community Treasure Hunt

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

Start Hunting!

Translated by