필터 지우기
필터 지우기

Is this a switchyarding case?

조회 수: 1 (최근 30일)
Iman Alsharkawi
Iman Alsharkawi 2011년 4월 14일
I have a figure with 4 checkboxes. I want to fill a 1x4 array with values of 1 if the checkbox is selected. What I've written below somewhat works, but only allows one value of chkbxvals to change and won't keep any previous values. All four checkboxes use the same callback.
So for example, if the user clicks on all four boxes, I want chkbxvals = [1 1 1 1]. If the user unchecks the first box, chkbxvals = [0 1 1 1]. If none are selected, then chkbxvals = [0 0 0 0]; and so on...
I know the long way to do this is to create 16 loops to cover all possible situations, but I feel as though there may be a more compact way to do it.
function input_chkbx_Callback(gcf,eventdata,handles,chkbxval)
chkbxvals = [0 0 0 0];
switch chkbxval
case 1
chkbxvals(1) = 1;
case 2
chkbxvals(2) = 1;
case 3
chkbxvals(3) = 1;
case 4
chkbxvals(4) = 1;
end
Thanks!

채택된 답변

Matt Fig
Matt Fig 2011년 4월 14일
Here is an example.
function [] = Check_examp()
% Print to screen the users checkbox choices.
S.fh = figure('units','pixels',...
'position',[500 500 200 220],...
'menubar','none',...
'name','Check_boxes',...
'numbertitle','off',...
'resize','off');
S.ch(1) = uicontrol('style','check',...
'unit','pix',...
'position',[10 60 180 20],...
'fontsize',14,...
'string','checkbox1');
S.ch(2) = uicontrol('style','check',...
'unit','pix',...
'position',[10 100 180 20],...
'fontsize',14,...
'string','checkbox2');
S.ch(3) = uicontrol('style','check',...
'unit','pix',...
'position',[10 140 180 20],...
'fontsize',14,...
'string','checkbox3');
S.ch(4) = uicontrol('style','check',...
'unit','pix',...
'position',[10 180 180 20],...
'fontsize',14,...
'string','checkbox4');
S.pb = uicontrol('style','push',...
'units','pix',...
'position',[10 10 180 40],...
'fontsize',14,...
'string','Get Boxes',...
'callback',{@pb_call,S});
function [] = pb_call(varargin)
% Callback for pushbutton, gets checkbox choices.
S = varargin{3}; % Get the structure.
V = cell2mat(get(S.ch(4:-1:1),'value')) % Get the users choice.
.
.
.
Note that if you are using GUIDE, you should modify the code in the callback by getting the handles to the checkboxes into a single vector when querying their value property. Something like:
S =[handles.ch1,handles.ch2,handles.ch3,handles.ch4];
V = cell2mat(get(S,'value'))
Also, note that I put the code in the callback to a pushbutton, but you can put it anywhere.
  댓글 수: 13
Iman Alsharkawi
Iman Alsharkawi 2011년 4월 14일
Thanks for the GUI examples! I'll email you about the issue I had with GUI_41 later... but in the meantime...
This is my callback function (to that example you gave me above):
function [] = pb_call(varargin)
% Callback for pushbutton, gets checkbox choices.
S = varargin{3}; % Get the structure.
S.V;
switch isempty(S.V)
case 1
V = cell2mat(get(S.ch(4:-1:1),'value')) % Get the users choice.
otherwise
msgbox('enter prompt box here')
end
S.V = V;
set(S.pb,'callback',{@pb_call,S})
I'm getting an error with the S.pb... ??? Reference to non-existent field 'pb'.
Matt Fig
Matt Fig 2011년 4월 14일
Oh, I see what happened. S does not have a field called pb when the callback is created! Use this instead:
set(gcbo,'callback',{@pb_call,S})
Or go back and initialize S.pb, then in a separate line assign the callback with:
set(S.pb,'callback',{@pb_call,S})

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

추가 답변 (1개)

Walter Roberson
Walter Roberson 2011년 4월 14일
What is the Callback property set to for these checkboxes? Callbacks do not take 4 inputs unless the Callback property has been set up specially, and the typical way of doing so would end up with the 4th argument always being the same as the value was when the callback property was set.
  댓글 수: 1
Iman Alsharkawi
Iman Alsharkawi 2011년 4월 14일
handles.first_chkbx = ...
uicontrol('Parent',handles.input_panel,...
'style','checkbox','units','normalized',...
'position',...
[xp01+0.002+ds21 yp03+dyp03-2*ds2-3*hbutton2 wbutton2 hbutton]);
set(handles.first_chkbx,...
'Callback',{@input_chkbx_Callback,handles,1});
handles.second_chkbx = ...
uicontrol('Parent',handles.input_panel,...
'style','checkbox','units','normalized',...
'position',...
[xp01+0.002+ds21 yp03+dyp03-2*ds2-3*hbutton2 wbutton2 hbutton]);
set(handles.second_chkbx,...
'Callback',{@input_chkbx_Callback,handles,2});
and so on...

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

카테고리

Help CenterFile Exchange에서 Interactive Control and Callbacks에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by