因此,对于一个自我项目,我在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
答案 0 :(得分:0)
与大多数问题一样,有很多不同的方法,写了类似的东西,我会给你提供我在编写辅助函数时使用的相同提示。
您的代码将根据按下的按钮执行操作,因此每个按钮都需要其自己的唯一ID和属性。根据所使用的MATLAB版本,每个图形元素都将具有handle。从R2014b开始,图形对象可以直接作为对象进行寻址,而不需要使用数字ID作为指针。
从图窗口开始,查看figure properties:
h.mainfig = figure; % Arbitrary figure window
get(h.mainfig); % Dump properties to command window
现在我们可能最感兴趣的是主图窗口的Units
和Position
属性,您可以在辅助函数中使用它来弄清楚如何调整按钮的大小和空间你创造它们。
如果我们使用uicontrol()
创建一个按钮图形对象,我们将获得大致相同的properties。
h.randombutton = uicontrol('Parent', h.mainfig, 'Style', 'pushbutton');
get(h.randombutton);
同样,我们对Units
和Position
属性感兴趣。我们也会对Callback
属性感兴趣,这是我们与按钮交互时执行的函数。另一个好的属性是Tag
属性,可用于为每个按钮设置唯一的字符串标记,以便与以后的逻辑一起使用。
您可能已经注意到我正在使用structure array来存储我的图形句柄。这类似于MATLAB在使用GUIDE创建GUI时生成其对象数据的方式,并且具有整齐的数据包传递我们的函数的巨大优势。关于结构数组的一个好处是你可以嵌套数据结构,允许我们轻松地生成和寻址图形对象,而不需要聪明地使用dynamic field references或eval()
(yuck)。我们可以这样做,而不必像button_1
,button_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,它会考虑调整大小等等。