在matlab中创建未知数量的uicontrol

时间:2015-02-19 14:00:23

标签: matlab matlab-figure

因此,对于一个自我项目,我在matlab中创建一个类似游戏的gui扫雷,并且想要创建一个可调节的按钮网格,但是我不知道如何这样做。这是我到目前为止所得到的。

function createField()

xAmount = str2double(inputdlg('enter row length'));
yAmount = str2double(inputdlg('enter column length'));

for i = 1:xAmount
    for j = 1:yAmount
    %create buttons
    end    
end
end

3 个答案:

答案 0 :(得分:0)

与大多数问题一样,有很多不同的方法,写了类似的东西,我会给你提供我在编写辅助函数时使用的相同提示。


您的代码将根据按下的按钮执行操作,因此每个按钮都需要其自己的唯一ID和属性。根据所使用的MATLAB版本,每个图形元素都将具有handle。从R2014b开始,图形对象可以直接作为对象进行寻址,而不需要使用数字ID作为指针。

从图窗口开始,查看figure properties

h.mainfig = figure; % Arbitrary figure window
get(h.mainfig); % Dump properties to command window

现在我们可能最感兴趣的是主图窗口的UnitsPosition属性,您可以在辅助函数中使用它来弄清楚如何调整按钮的大小和空间你创造它们。

如果我们使用uicontrol()创建一个按钮图形对象,我们将获得大致相同的properties

h.randombutton = uicontrol('Parent', h.mainfig, 'Style', 'pushbutton');
get(h.randombutton);

同样,我们对UnitsPosition属性感兴趣。我们也会对Callback属性感兴趣,这是我们与按钮交互时执行的函数。另一个好的属性是Tag属性,可用于为每个按钮设置唯一的字符串标记,以便与以后的逻辑一起使用。


您可能已经注意到我正在使用structure array来存储我的图形句柄。这类似于MATLAB在使用GUIDE创建GUI时生成其对象数据的方式,并且具有整齐的数据包传递我们的函数的巨大优势。关于结构数组的一个好处是你可以嵌套数据结构,允许我们轻松地生成和寻址图形对象,而不需要聪明地使用dynamic field referenceseval()(yuck)。我们可以这样做,而不必像button_1button_2等那样做。

h.button(1) = uicontrol('Parent', h.mainfig, 'Style', 'pushbutton');
h.button(2) = uicontrol('Parent', h.mainfig, 'Style', 'pushbutton');
...
h.button(n) = uicontrol('Parent', h.mainfig, 'Style', 'pushbutton');

现在我们知道如何以编程方式生成任意数量的按钮,以后可以轻松解决这些问题。


除了按钮生成之外,我们还有另一个我之前提到的按键功能,即按钮回调。回调函数遵循slightly different syntax,因为它们本身传递两个参数,即执行回调的对象的句柄和事件数据结构(有关详细信息,请参阅文档)。因为函数知道UI对象调用了什么,所以我们可以创建一个非常通用的函数。

希望这有帮助!

答案 1 :(得分:0)

一种解决方案可能是:

function create_field(hparent, nx, ny, width, padding)

        % Test arguments
        if ~test_parent_handle(hparent)
                error('Parent must be a single valid graphic handle.');
        elseif ~test_positive_integer(nx)
                error('Number of buttons on X direction must be a scalar positive integer.');
        elseif ~test_positive_integer(ny)
                error('Number of buttons on Y direction must be a scalar positive integer.');
        elseif ~test_positive_integer(width) ...
        || (width >= 100)
                error('Button width must be a scalar positive integer smaller than 100.');
        elseif ~test_positive_integer(padding) ...
        || (padding >= 20)
                error('Button padding must be a scalar positive integer smaller than 20.');
        end;

        % Resize the parent to fit the button grid
        set(hparent, 'Units', 'pixels');
        ppos = get(hparent, 'Position');
        ppos(3) = nx*width + (nx-1)*padding;
        ppos(4) = ny*width + (ny-1)*padding;
        set(hparent, 'Position', ppos);

        % Create button grid
        for p = 1:nx
                for q = 1:ny
                        bpos = [                  % Button spec:
                           (p-1)*(width+padding)  %  - X
                           (q-1)*(width+padding)  %  - Y
                           width                  %  - W
                           width                  %  - H
                        ];
                        uicontrol(                              ...
                           'Units',     'pixels',               ...
                           'Tag',       sprintf('X%dY%d',p,q),  ...
                           'Style',     'pushbutton',           ...
                           'Parent',    hparent,                ...
                           'Position',  bpos                    ...                   
                        );
                end;
        end;

        % ----- NESTED FUNCTIONS -----
        function tf = test_parent_handle(value)
                tf = isscalar(value) ...
                  && ishandle(value);
        end

        function tf = test_positive_integer(value)
                tf = isscalar(value) ...
                  && isreal(value) ...
                  && isfinite(value) ...
                  && (value > 0) ...
                  && (fix(value) == value);
        end
end

对于一个15 x 10方形按钮的图形,每个按钮的边长为25像素,按钮之间有3个像素的填充,请致电:

create_field(figure(), 15, 10, 20, 3);

答案 2 :(得分:0)

您是否考虑过在Java中创建ui - 未记录的matlab有一些examples。 Java会为你提供很好的LayoutManagers,它会考虑调整大小等等。