Как добавить управление индикатором прогресса в графический интерфейс Matlab? - PullRequest
18 голосов
/ 20 марта 2011

Есть ли готовый прогресс-бар uicontrol, который можно добавить в графический интерфейс Matlab, компонент uicontrol или ActiveX?

[править] Я знаю о функции панели ожидания, я имел в виду компонент, который можно внедрить в разработанный GUI, а не просто выскочить из окна. Что-то вроде состояния батареи в строке состояния.

Ответы [ 7 ]

28 голосов
/ 21 марта 2011

Панель ожидания и ее варианты отображают всплывающее окно со строкой состояния.В большинстве приложений это нормально и очень просто в использовании.

Если вы хотите интегрировать индикатор выполнения в существующее окно графического интерфейса, у вас есть несколько вариантов:

  1. реализовать внутреннийкод панели ожидания - на самом деле это просто оси, представляющие цветной патч, ширина которого зависит от значения прогресса.
  2. использует стандартный java.swing.JProgressBar , который можно добавить в ваш MatlabGUI через встроенную функцию javacomponent
  3. используйте утилиту StatusBar или объяснение здесь , чтобы добавить индикатор выполнения в статус окна GUI-bar

Все эти варианты работают на всех платформах Matlab.

6 голосов
/ 20 марта 2011

Да, есть.Функция waitbar - это то, что вам нужно.Примеры там легко следовать, и вы можете начать прямо сейчас.Он должен нормально работать на всех 3 платформах (Windows / OS X / Linux).

4 голосов
/ 31 мая 2013

Адаптируя мой код из этого MatLab Newgroup комментария, я смог собрать следующее:

function h = uiProgressBar(varargin)
%uiProgressBar: A waitbar that can be embedded in a GUI figure.

    if ishandle(varargin{1}) && size(varargin, 2) > 1
        ax = varargin{1};
        value = varargin{2};
        p = get(ax,'Child');
        x = get(p,'XData');
        x(3:4) = value;
        set(p,'XData',x)
        return
    end

    bg_color = 'w';
    fg_color = 'r';
    h = axes('Units','pixels',...
        'XLim',[0 1],'YLim',[0 1],...
        'XTick',[],'YTick',[],...
        'Color',bg_color,...
        'XColor',bg_color,'YColor',bg_color, ...
        'Parent', varargin{1});
    patch([0 0 0 0],[0 1 1 0],fg_color,...
        'Parent',h,...
        'EdgeColor','none',...
        'EraseMode','none');
end

Создание выполняется следующим образом, где parent - родительская панель, к которой вы хотите добавить ее:

myProgressBar = uiProgressBar(parent);

и обновление индикатора выполнения так же просто, как это:

uiProgressBar(myProgressBar, .2);

Вот полный рабочий пример использования figure:

f = figure('Name', 'Progress Bar Example', 'Position', [100 100 800 600]);

progressBar = uiProgressBar(f);

for i = 1:10:100
    uiProgressBar(progressBar, i/100);
    pause(.5);
end

ProgressBarLook

3 голосов
/ 06 сентября 2013

Другое простое решение - использовать два вложенных uipanels, например:

function MyProgressBar(handle, progress)
   % progress = 0.00001 .... 1

   % 1st panel
   p = uipanel(handle);

   % 2n panel as bar
   bar = uipanel(p);
    set(bar, 'BackgroundColor', 'red');
    x = get(bar, 'Position');
    x(3) = progress;       % Corresponds to % progress if unit = normalized
    set(bar, 'Position',x);
end

Использование:

 f = figure();
 set(f,'Position',[100,100,400,40]);
 MyProgressBar(f, 0.5); % corresponds to 50% progress
2 голосов
/ 20 февраля 2014

Для всех, кто еще заинтересован, вот мое решение с использованием класса:

classdef progressbar < handle
    properties(Access = protected)
        h_panel         % Panel on which everything sits
        h_ax            % The progress range axes
        h_pbar          % The bar representing progress (patch)
        h_ptext         % Percentage label
    end
    properties(Access = public, Dependent = true)
        range           % Progress range
        pvalue          % Current value
        percent         % Percentage complete (relative within range)
        position        % Position of the object (panel)
        ax_tag          % Tag of the axes
        visible         % Is the object (panel) visible?
    end
    properties(Constant = true)
        default_color = [.75 .75 .9];
    end
    methods
        % Initializer
        function obj = progressbar(fig, pos, range)
            if nargin < 3
                range = [0 1];
            end
            obj.h_panel = uipanel('Parent', fig, 'Units', 'Inches', ...
                'Position', pos, 'Tag', 'progbar_panel');
            obj.h_ax = axes('Parent', obj.h_panel, ...
                'Units', 'Inches', 'Position', [0 0 obj.position(3) obj.position(4)], ...
                'XTickLabel', '', 'XTick', [], 'YTickLabel', '', 'YTick', []);
            obj.h_pbar = patch([range(1) range(1) range(1) range(1)], [0 0 2 2], ...
                obj.default_color, 'Parent', obj.h_ax, 'Tag', 'progbar_patch');
            obj.h_ptext = text(obj.position(3)/2, obj.position(4)/2, '0%', ...
                'Parent', obj.h_ax, 'FontWeight', 'bold', 'Units', 'Inches', ...
                'HorizontalAlignment', 'center', 'Tag', 'progbar_text');
            obj.range = range;
            obj.ax_tag = 'progbar_ax';
        end

        % Property Access Methods
        function set.range(obj, value)
            % Instead of replotting, just reset the XLim to the
            % extremities of the input range. If the values are not
            % increasing, just default to [0 1].
            if value(end) > value(1)
                set(obj.h_ax, 'XLim', value([1,end]), 'YLim', [0 2]);
            else
                set(obj.h_ax, 'XLim', [0 1], 'YLim', [0 2]);
            end
            % Reset progress.
            obj.pvalue = value(1);
        end
        function value = get.range(obj)
            value = get(obj.h_ax, 'XLim');
        end
        function set.pvalue(obj, value)
            % Expects a single value to represent progress value and
            % constructs the selection rectangle from that. If multiple
            % values are passed in, all are ignored but the last, since the
            % left edge of the bar is always the first element of the
            % range.
            set(obj.h_pbar, 'XData', [obj.range(1) value(end) value(end) obj.range(1)], ...
                'FaceColor', obj.default_color);
            set(obj.h_ptext, 'String', sprintf('%3.0f%%', obj.percent * 100));
        end
        function value = get.pvalue(obj)
            % The progress bar is actually 2D, but we treat as if it is 1D.
            % Hence the XData is actually an array of four values but we
            % only consider the second (progress maximum).
            limits = get(obj.h_pbar, 'XData');
            value = limits(2);
        end
        function set.percent(obj, value)
            % Expects a single value between 0 and 1.
            limits = obj.range;
            obj.pvalue = value * (limits(2) - limits(1)) + limits(1);
        end
        function value = get.percent(obj)
            limits = obj.range;
            value = (obj.pvalue - limits(1)) / (limits(2) - limits(1));
        end
        function set.position(obj, value)
            set(obj.h_panel, 'Position', value);
        end
        function value = get.position(obj)
            value = get(obj.h_panel, 'Position');
        end
        function set.ax_tag(obj, value)
            set(obj.h_ax, 'Tag', value);
        end
        function value = get.ax_tag(obj)
            value = get(obj.h_ax, 'Tag');
        end
        function set.visible(obj, value)
            if (isnumeric(value) && value >= 1) || strcmp(value, 'on') == 1 || strcmp(value, 'On') == 1
                set(obj.h_panel, 'Visible', 'on');
            else
                set(obj.h_panel, 'Visible', 'off');
            end
        end
        function value = get.visible(obj)
            vis = get(obj.h_panel, 'Visible');
            value = strcmp(vis, 'on');
        end

        % Public member functions
        function increment(obj)
            % Don't use this if the range is less than 1.
            obj.pvalue = obj.pvalue + 1;
        end
        function display_text(obj, text, color)
            if nargin == 3 && ~isempty(color)
                set(obj.h_pbar, 'FaceColor', color);
            end
            set(obj.h_ptext, 'String', text);
        end
    end
end

Объявить экземпляр следующим образом: pb = progressbar(gcf, [1 1], [0 20]);

Может использоваться с относительными или действительными числами, т.е. pb.pvalue = 10; и pb.percent = .5; делают то же самое в моем примере.

Моя версия содержит текстовый объект в середине индикатора выполнения, отображающий текущий процент.

Моя последняя версия доступна здесь .

1 голос
/ 15 июня 2012

Matlab имеет встроенную 'панель ожидания' ... вы также можете использовать любой из этих инструментов с сайта Matlab:

http://www.mathworks.com/matlabcentral/fileexchange/26773-progress-bar&watching=26773

http://www.mathworks.com/matlabcentral/fileexchange/3607-progressbar

0 голосов
/ 07 декабря 2016

Есть другой способ ... Извините, если это было упомянуто, и я пропустил это.Вы можете построить фигуру, динамически добавляя оси для стержня. Она работает очень хорошо и легко адаптируется для пользовательских приложений.Всплывающие окна всегда терялись или мешали.

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