Search code examples
matlabuser-interfacelistboxuicontrol

How to add items to a listbox via GUI


I am desperately trying to create a logbox for my GUI. What i would like to do is for the start, to write text in a list after having pushed a PUSH Button. The Callback function of the PUSH Button is:

function run__Callback(hObject, eventdata, handles)

   initial_name=cellstr(get(handles.logbox1,'String'))
    handles.names={'test','haus', 'top', 'down', 'optimistic'}
    handles.names{end,end}=[]                                   %Add Element for new text 
    handles.names{end,end}='neuuu'                              %Add Element
    num_element=length(handles.names)                           %Count Elements
    set(handles.logbox1,'String',handles.names)                 %Aktualisiere Liste

    set(handles.logbox1,'Top',num_element)                      %Set Listbox to the last Element

and the listbox is in the same GUI. Nevertheless, there is the error:

rror using hg.uicontrol/set

The name 'Top' is not an accessible property for an instance of class 'uicontrol'.

Can anyone help me please, i dont understand whats wrong?

Best regards, John


Solution

  • You've got the error because Top is not a property of the listbox uicontrol; moreover, Top is not a property of any uicontrol.

    You can find here the list of uicontrol properties.

    The most listbox property close to "Top" is ListboxTop.

    I've created two simple GUIs that could help you managing the acccess to the listbox.

    The Main GUI "add_to_listbox" contains:

    • a listbox with tag listbox1
    • a pushbutton with tag pushbutton1, String "Add Action": each time the user pushes it, a string such as "Main GUI: Inserted string #x" is added on top of listbox ("x" is a conter)
    • a pushbutton with tag "open_subgui", String "Open SubGUI" to open the second GUI

    The SubGUI ("add_to_listbox_subgui") contains

    • a pushbutton with tag pushbutton1, String "Add Action on Main GUI": each time the user pushes it, a string such as "SUB GUI Inserted string #x" is added on top of the Main GUI listbox ("x" is a conter)

    The SubGUI handles the addition of strings to the Main GUI listbox by using the Main GUi listbox handle which is stored in the Main GUI guidata (when the SubGUI is opened by the Main GUI, it receives as input the handle to the Main GUI; through it the SubGUI access to the Main GUI guidata).

    In the following you can find the:

    • Main GUI OpeningFcn in which the "action counter" in initialized
    • Main GUI pushbutton1_Callback that adds a string in the listbox each time the pushbutton is pressed
    • Main GUI open_subgui_Callback which opens the SubGUI
    • SubGUI OpeningFcn in which both SubGUI and Main GUI guidata are handled
    • SubGUI pushbutton1_Callback that adds a string in the Main GUI listbox each time the pushbutton is pressed

    Main GUI OpeningFcn

    % --- Executes just before add_to_listbox is made visible.
    function add_to_listbox_OpeningFcn(hObject, eventdata, handles, varargin)
    % This function has no output args, see OutputFcn.
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    % varargin   command line arguments to add_to_listbox (see VARARGIN)
    
    % Choose default command line output for add_to_listbox
    handles.output = hObject;
    
    % Update handles structure
    guidata(hObject, handles);
    
    % UIWAIT makes add_to_listbox wait for user response (see UIRESUME)
    % uiwait(handles.figure1);
    %
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %
    % Get Main GUI guidata
    gui_data=guidata(gcf);
    % Add (and initialize) button action counter to Main GUI guidata
    gui_data.btn_action=0;
    % Set Main GUI guidata
    guidata(gcf,gui_data);
    %
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %
    

    Main GUI pushbutton1_Callback

    % --- Executes on button press in pushbutton1.
    function pushbutton1_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    %
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %
    % Add button action (from Main GUI) string to the listbox
    %
    % Get Mani GUI guidata
    gui_data=guidata(gcf);
    % Increment button action counter
    gui_data.btn_action=gui_data.btn_action+1;
    % Set Main GUI guidata (to store button action counter)
    guidata(gcf,gui_data);
    % Generate action string and add it to the listbox
    % The firt strimg is directly add to the listbox
    if(gui_data.btn_action == 1)
       new_str='Main GUI: Inserted string #1';
       set(handles.listbox1,'string',new_str);
    else
       new_str=['Main GUI: Inserted string #' num2str(gui_data.btn_action)];
       % The fisrt string in the list box is returned as "string", to add the
       % second one, it has has to be first converted into a cellarray
       if(gui_data.btn_action == 2)
          tmp_str=cellstr(get(handles.listbox1,'string'));
       else
          % The order of the string in the listbox is reversed to have the last
          % one on top
          tmp_str=flipud(get(handles.listbox1,'string'));
       end
       % Set the updated set of seting to the listbox
       tmp_str{end+1,1}=new_str;
       set(handles.listbox1,'string',flipud(tmp_str));
    end
    

    Main GUI open_subgui_Callback

    % --- Executes on button press in open_subgui.
    function open_subgui_Callback(hObject, eventdata, handles)
    % hObject    handle to open_subgui (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    %
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %
    % Open the Sub GUI; the handle of the Main GUI is passed as argument to
    % This allows Sub GUI accessing to the Main GUI guidata
    add_to_listbox_subgui(gcf)
    % Disable the "Open Sub GUI" button
    set(handles.open_subgui,'enable','off')
    

    SubGUI OpeningFcn

    % --- Executes on button press in pushbutton1.
    function pushbutton1_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    %
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %
    % Add Sub GUI button action string to Main GUI listbox
    %
    % Get Sub GUI guidata
    gui_data=guidata(gcf);
    % Get Main GUI guidata, "gui_data.main_gui" holds the Main GUI handle
    gui_data.main_gui_data=guidata(gui_data.main_gui);
    % Increment the button action counter
    gui_data.btn_action=gui_data.main_gui_data.btn_action+1;
    % Update Main GUI button actin counter
    main_gui_data=guidata(gui_data.main_gui);
    main_gui_data.btn_action=gui_data.btn_action;
    % Store Sub GUI guidata
    guidata(gcf,gui_data);
    % Store Main GUI guidata
    guidata(gui_data.main_gui,main_gui_data);
    %
    % Add button action (from Main GUI) string to the listbox
    %
    if(gui_data.btn_action == 1)
       % Generate action string and add it to the Main GUI listbox
       % The firt strimg is directly add to the listbox
       new_str='SUB GUI Inserted string #1';
       set(gui_data.listbox,'string',new_str);
    else
       new_str=['SUB GUI Inserted string #' num2str(gui_data.btn_action)];
       % The fisrt string in the list box is returned as "string", to add the
       % second one, it has has to be first converted into a cellarray
       if(gui_data.btn_action == 2)
          tmp_str=cellstr(get(gui_data.listbox,'string'));
       else
          % The order of the string in the listbox is reversed to have the last
          % one on top
          tmp_str=flipud(get(gui_data.listbox,'string'));
       end
       % Set the updated set of seting to the listbox
       tmp_str{end+1,1}=new_str;
       set(gui_data.listbox,'string',flipud(tmp_str));
    end
    

    enter image description here

    Hope this helps.