简体   繁体   English

如何将进度条控件添加到Matlab gui?

[英]How to add progress bar control to Matlab gui?

Is there a ready made progress bar uicontrol that can be added to Matlab gui, either uicontrol or ActiveX component? 是否有现成的进度条uicontrol可以添加到Matlab gui,uicontrol或ActiveX组件?

[edit] I know about the waitbar function, I meant a component that can be implemented into the designed GUI and not just pop out of the window. [edit]我知道waitbar函数,我的意思是一个可以在设计的GUI中实现的组件,而不仅仅是弹出窗口。 Something like battery status in status bar. 状态栏中的电池状态。

Waitbar and its variants display a popup window with a status bar. Waitbar及其变体显示一个带状态栏的弹出窗口。 In most applications this is ok and very simple to use. 在大多数应用程序中,这很好并且使用起来非常简单。

If you want to integrate a progress-bar within an existing GUI window, you have several choices: 如果要在现有GUI窗口中集成进度条,可以有以下几种选择:

  1. implement the internal waitbar code - this is really just an axes that presents a colored patch whose width depends on the progress value. 实现内部waitbar代码 - 这实际上只是一个呈现彩色补丁的轴,其宽度取决于进度值。
  2. use the standard java.swing.JProgressBar , which can be added to your Matlab GUI via the built-in javacomponent function 使用标准的java.swing.JProgressBar ,它可以通过内置的javacomponent函数添加到你的Matlab GUI中
  3. use the StatusBar utility or the explanation here to add a progress bar to your GUI window's status-bar 使用StatusBar实用程序此处的说明向GUI窗口的状态栏添加进度条

All of these choices work on all Matlab platforms. 所有这些选择都适用于所有Matlab平台。

Yes, there is. 就在这里。 The waitbar function is what you need. 等待吧功能是您所需要的。 The examples there are easy to follow and you can get started right away. 这些示例很容易理解,您可以立即开始使用。 It should work fine on all 3 platforms (Windows/OS X/Linux). 它应该适用于所有3个平台(Windows / OS X / Linux)。

Adapting my code from this MatLab Newgroup comment, I was able to put together the following: 根据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

Creation is as follows, where parent is the parent panel that you want to add it to: 创建如下,其中parent是要将其添加到的父面板:

myProgressBar = uiProgressBar(parent);

and updating the progress bar is as simple as this: 并更新进度条就像这样简单:

uiProgressBar(myProgressBar, .2);

Here's a full working example using a figure : 这是一个使用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

another simple solution is to use two nested uipanels like this: 另一个简单的解决方案是使用两个嵌套的uipanel,如下所示:

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

Usage: 用法:

 f = figure();
 set(f,'Position',[100,100,400,40]);
 MyProgressBar(f, 0.5); % corresponds to 50% progress

For anyone still interested, here's my solution using a class: 对于仍然感兴趣的人,这是我使用类的解决方案:

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

Declare an instance like so: pb = progressbar(gcf, [1 1], [0 20]); 声明一个像这样的实例: pb = progressbar(gcf, [1 1], [0 20]);

It can be used with relative or actual numbers, ie pb.pvalue = 10; 它可以与相对或实际数字一起使用,即pb.pvalue = 10; and pb.percent = .5; pb.percent = .5; do the same thing in my example. 在我的例子中做同样的事情。

My version features a text object in the middle of the progress bar that displays the current percentage. 我的版本在进度条中间有一个文本对象,显示当前百分比。

My latest version is available here . 我的最新版本可在此处获得

There is another way... Sorry if it was mentioned and I missed it. 还有另外一种方式......对不起,如果它被提及我错过了它。 You can build a figure dynamicly adding the axes for a bar.. It works very nicely and easly adaptable for custom applications. 您可以构建一个动态添加条形轴的图形。它非常好用,并且很容易适应自定义应用程序。 Pop ups were always getting lost or in the way. 弹出窗口总是迷路或挡路。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM