Связывание данных с ListBox в MATLAB - PullRequest
1 голос
/ 06 ноября 2019

StackOverflow!

Я рад сообщить, что мне удалось создать ListBox, который заполняется именами файлов в зависимости от выбора моей папки. Тем не менее, я столкнулся с довольно препятствием.

Я хочу отображать данные в зависимости от выбора в списке. В настоящее время моя программа MATLAB выполняет следующие действия: 1. Пользователь может «Искать» нужную папку с помощью функции PshButton. 2. После выбора папки список будет перечислять каждый файл, содержащий данные GPX, в список. 3. Я хочу иметь возможность выбрать файл из указанного списка и отобразить данные с помощью другого обратного вызова PushButton.

Моя проблема в том, что я не знаю, как установить это соединение программно. Я думал, что это будет так же просто, как установить ItemsData для данных, найденных в каждой папке. Может быть, я не пойду правильно.

Ниже приведен мой код:

classdef HalloweenApp < matlab.apps.AppBase

% Properties that correspond to app components
properties (Access = public)
    UIFigure                  matlab.ui.Figure
    SearchButton              matlab.ui.control.Button
    FoldernameEditFieldLabel  matlab.ui.control.Label
    FoldernameEditField       matlab.ui.control.EditField
    DataListBoxLabel          matlab.ui.control.Label
    DataListBox               matlab.ui.control.ListBox
    PlotButton                matlab.ui.control.Button
end


properties (Access = public)
    gpxfolder % Selected file path for GPX folder
    gpxfiles % Folder with GPX files 
    chosenfile % The specific file for plot
    n % Number of files in the folder
    data % Cell array of information that will be loaded 
end


methods (Access = private)

    % Button pushed function: SearchButton
    function SearchButtonPushed(app, event)
        app.gpxfolder = uigetdir(); % Open dialog box for selecting folder. 
        app.gpxfiles = dir(fullfile(app.gpxfolder, '*.gpx')); % Dir all *gpx in selected folder. 
        % Number of files in that folder.
        app.n = numel(app.gpxfiles);
        app.FoldernameEditField.Value = app.gpxfolder;
        % Populate Listbox with file names
        app.DataListBox.Items = {app.gpxfiles(:).name};
        app.data = cell(1,app.n);
for k=1:app.n
        hold all
        % Creates a colormap based on the amount of files we have
        cmap = hsv(k);
        % Read each file 
        app.data{k} = gpxread(fullfile(app.gpxfolder, app.gpxfiles(k).name)); 
        baseFileName = app.gpxfiles(k).name;
        fullFileName = fullfile(app.gpxfolder, baseFileName);
        fprintf(1, 'Now reading %s\n', fullFileName);
end
    end

    % Button pushed function: PlotButton
    function PlotButtonPushed(app, event)
        app.chosenfile = app.DataListBox.Value;
        assignin('base','chosenfile',app.chosenfile)
        **app.DataListBox.ItemsData = app.data{k};** 
    end
end

% App initialization and construction
methods (Access = private)

    % Create UIFigure and components
    function createComponents(app)

        % Create UIFigure
        app.UIFigure = uifigure;
        app.UIFigure.Position = [100 100 914 678];
        app.UIFigure.Name = 'UI Figure';

        % Create SearchButton
        app.SearchButton = uibutton(app.UIFigure, 'push');
        app.SearchButton.ButtonPushedFcn = createCallbackFcn(app, @SearchButtonPushed, true);
        app.SearchButton.Position = [568 633 100 22];
        app.SearchButton.Text = 'Search';

        % Create FoldernameEditFieldLabel
        app.FoldernameEditFieldLabel = uilabel(app.UIFigure);
        app.FoldernameEditFieldLabel.HorizontalAlignment = 'right';
        app.FoldernameEditFieldLabel.Position = [22 637 77 15];
        app.FoldernameEditFieldLabel.Text = 'Folder name:';

        % Create FoldernameEditField
        app.FoldernameEditField = uieditfield(app.UIFigure, 'text');
        app.FoldernameEditField.Position = [114 633 431 22];

        % Create DataListBoxLabel
        app.DataListBoxLabel = uilabel(app.UIFigure);
        app.DataListBoxLabel.HorizontalAlignment = 'right';
        app.DataListBoxLabel.Position = [65 584 34 15];
        app.DataListBoxLabel.Text = 'Data:';

        % Create DataListBox
        app.DataListBox = uilistbox(app.UIFigure);
        app.DataListBox.Items = {};
        app.DataListBox.Multiselect = 'on';
        app.DataListBox.Position = [114 527 431 74];
        app.DataListBox.Value = {};

        % Create PlotButton
        app.PlotButton = uibutton(app.UIFigure, 'push');
        app.PlotButton.ButtonPushedFcn = createCallbackFcn(app, @PlotButtonPushed, true);
        app.PlotButton.Position = [445 495 100 22];
        app.PlotButton.Text = 'Plot';
    end
end

methods (Access = public)

    % Construct app
    function app = HalloweenApp

        % Create and configure components
        createComponents(app)

        % Register the app with App Designer
        registerApp(app, app.UIFigure)

        if nargout == 0
            clear app
        end
    end

    % Code that executes before app deletion
    function delete(app)

        % Delete UIFigure when app is deleted
        delete(app.UIFigure)
    end
end

end

Я подтолкнул строку в своем коде, которая, по моему мнению, вызывает проблемы.

1 Ответ

0 голосов
/ 06 ноября 2019

Вы можете установить соединение, используя «сопоставление индекса»:

Сохраните baseFileName в ячейке с тем же индексом, что и сопоставление данных:

%Your code:
app.data{k} = gpxread(fullfile(app.gpxfolder, app.gpxfiles(k).name)); 

%Additional code:
%$$$
%Store the baseFileName in a cell array.
app.baseFileNames{k} = baseFileName;
%$$$

Обратите внимание: индекс k одинаково в обоих списках.

В функции PlotButtonPushed вы можете сопоставить индексы:

baseFileName = app.chosenfile{k};

%Find the index of chosen file (with name baseFileName) in app.DataListBox.Items.
idx = find(strcmp(app.baseFileNames, baseFileName));

%After finding the index, we can get the data.
p = app.data{idx};

Вот полный код:

classdef HalloweenApp < matlab.apps.AppBase

% Properties that correspond to app components
properties (Access = public)
    UIFigure                  matlab.ui.Figure
    SearchButton              matlab.ui.control.Button
    FoldernameEditFieldLabel  matlab.ui.control.Label
    FoldernameEditField       matlab.ui.control.EditField
    DataListBoxLabel          matlab.ui.control.Label
    DataListBox               matlab.ui.control.ListBox
    PlotButton                matlab.ui.control.Button
end


properties (Access = public)
    gpxfolder % Selected file path for GPX folder
    gpxfiles % Folder with GPX files 
    chosenfile % The specific file for plot
    n % Number of files in the folder
    data % Cell array of information that will be loaded

    %$$$
    baseFileNames %Cell array of base file names.
    %$$$
end


methods (Access = private)

    % Button pushed function: SearchButton
    function SearchButtonPushed(app, event)
        app.gpxfolder = uigetdir(); % Open dialog box for selecting folder. 
        app.gpxfiles = dir(fullfile(app.gpxfolder, '*.gpx')); % Dir all *gpx in selected folder. 
        % Number of files in that folder.
        app.n = numel(app.gpxfiles);
        app.FoldernameEditField.Value = app.gpxfolder;
        % Populate Listbox with file names
        app.DataListBox.Items = {app.gpxfiles(:).name};
        app.data = cell(1,app.n);

        %$$$
        app.baseFileNames = cell(1,app.n); %Allocate empty cell 
        %$$$

        for k=1:app.n
            hold all
            % Creates a colormap based on the amount of files we have
            cmap = hsv(k);
            % Read each file 
            app.data{k} = gpxread(fullfile(app.gpxfolder, app.gpxfiles(k).name)); 
            baseFileName = app.gpxfiles(k).name;
            fullFileName = fullfile(app.gpxfolder, baseFileName);            
            fprintf(1, 'Now reading %s\n', fullFileName);

            %$$$
            %Store the baseFileName in a cell array.
            app.baseFileNames{k} = baseFileName;
            %$$$
        end
    end

    % Button pushed function: PlotButton
    function PlotButtonPushed(app, event)
        app.chosenfile = app.DataListBox.Value;
        assignin('base','chosenfile',app.chosenfile)

        %**app.DataListBox.ItemsData = app.data{k};**

        %$$$
        %Assume multiple selection is enabled, so we need a for loop
        for k = 1:length(app.chosenfile)
            baseFileName = app.chosenfile{k};

            %Find the index of chosen file (with name baseFileName) in app.DataListBox.Items.
            idx = find(strcmp(app.baseFileNames, baseFileName));

            %After finding the index, we can get the data.
            %Remember we intitialize data and baseFileNames with the same "k" index
            %   app.data{k} = gpxread(fullfile(app.gpxfolder, app.gpxfiles(k).name));            
            %   app.baseFileNames{k} = baseFileName;
            p = app.data{idx};

            %Do something with the gpx data...
            geoshow(p);
        end
        %$$$
    end
end

% App initialization and construction
methods (Access = private)

    % Create UIFigure and components
    function createComponents(app)

        % Create UIFigure
        app.UIFigure = uifigure;
        app.UIFigure.Position = [100 100 914 678];
        app.UIFigure.Name = 'UI Figure';

        % Create SearchButton
        app.SearchButton = uibutton(app.UIFigure, 'push');
        app.SearchButton.ButtonPushedFcn = createCallbackFcn(app, @SearchButtonPushed, true);
        app.SearchButton.Position = [568 633 100 22];
        app.SearchButton.Text = 'Search';

        % Create FoldernameEditFieldLabel
        app.FoldernameEditFieldLabel = uilabel(app.UIFigure);
        app.FoldernameEditFieldLabel.HorizontalAlignment = 'right';
        app.FoldernameEditFieldLabel.Position = [22 637 77 15];
        app.FoldernameEditFieldLabel.Text = 'Folder name:';

        % Create FoldernameEditField
        app.FoldernameEditField = uieditfield(app.UIFigure, 'text');
        app.FoldernameEditField.Position = [114 633 431 22];

        % Create DataListBoxLabel
        app.DataListBoxLabel = uilabel(app.UIFigure);
        app.DataListBoxLabel.HorizontalAlignment = 'right';
        app.DataListBoxLabel.Position = [65 584 34 15];
        app.DataListBoxLabel.Text = 'Data:';

        % Create DataListBox
        app.DataListBox = uilistbox(app.UIFigure);
        app.DataListBox.Items = {};
        app.DataListBox.Multiselect = 'on';
        app.DataListBox.Position = [114 527 431 74];
        app.DataListBox.Value = {};

        % Create PlotButton
        app.PlotButton = uibutton(app.UIFigure, 'push');
        app.PlotButton.ButtonPushedFcn = createCallbackFcn(app, @PlotButtonPushed, true);
        app.PlotButton.Position = [445 495 100 22];
        app.PlotButton.Text = 'Plot';
    end
end

methods (Access = public)

    % Construct app
    function app = HalloweenApp

        % Create and configure components
        createComponents(app)

        % Register the app with App Designer
        registerApp(app, app.UIFigure)

        if nargout == 0
            clear app
        end
    end

    % Code that executes before app deletion
    function delete(app)

        % Delete UIFigure when app is deleted
        delete(app.UIFigure)
    end
end

end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...