我使用三个弹出菜单创建了一个绘图仪:一个用于X变量,一个用于Y,一个用于图形名称。选择图形名称(编号)时,其回调函数会从X和Y弹出菜单中抓取字符串,从加载的数据集中搜索这些字符串,并在选定的图形上绘制它们。
我想要做的是在弹出菜单上进行多选。我研究了很多,并了解到弹出式菜单没有以常规记录的方式 。
我不想和几乎不能使用列表框的原因是我的GUI从上到下有很多面板;每个包含上面提到的三个弹出菜单。每个面板代表一个数据集。这意味着如果我选择并加载十个.MAT文件,将从上到下创建一个包含10个面板的GUI。每个数据集可以包含多达100个或更多变量。列表框的高度(显示,例如,只显示十个变量)和X(时间)10之上和之下的一些边距将创建一个基本上无法使用的巨大GUI。
我遇到了一些可能通过使用JcomboBox和一些严厉警告而工作的java脚本讨论,但我实际上并没有找到它的代码。
有办法吗?
想象一下,在下面的快照中,Y轴弹出菜单中的下拉列表实际上是一个列表框,所有面板也都有相同的高度列表框。它很难有效地使用这个工具。我想要做的是选择一个X变量,例如TIME(这是弹出菜单的方式),并能够选择多个Y变量。然后,当我选择一个图形时,绘图仪将根据所选的X变量绘制那些Y变量。我可以迭代地做到这一点。我们小组中有人要求这种能力,我正在确定其可能性
我整合了@excaza的想法,我很难弄清楚如何保留所选的y变量名,同时我选择一个数字来绘制它们。见下图。
这肯定是朝着正确的方向发展的。我现在的问题是我可以保留所选的索引信息。下面的函数是" Y轴"的回调函数。按钮。我在考虑将选定的y变量名称存储到其Tag属性中,但我不确定这是否是个好主意。我当然也不想创建一个全局变量。有什么想法吗?
function select_yvar(handle,event,list_yvar)
plot_h = get(get(get(handle.Parent,'Parent'),'Parent'),'Parent');
WinOnTop(plot_h,false);
[yvar_sel,~] = listdlg('Name', 'Variables', 'PromptString', 'Select variable(s)',...
'SelectionMode', 'multiple', 'ListString', list_yvar);
答案 0 :(得分:0)
我建议尝试使用listdlg
的弹出式按钮,而不是试图破解一些可能最终会破坏的底层Java。
我制作了一个玩具示例GUI,它使用listdlg
选项来驱动轴上绘制的内容。虽然您的应用程序无疑会有所不同,但应该能够采用类似的方法。
classdef testGUI < handle
properties
fig
ax
xdropdown
ydropbutt
data
plotbool
end
methods
function GUIobj = testGUI()
initGUI(GUIobj)
if nargout == 0
clear GUIobj
end
end
function initGUI(GUIobj)
GUIobj.data.x = -10:10;
GUIobj.data.y1 = GUIobj.data.x;
GUIobj.data.y2 = GUIobj.data.x.^2;
GUIobj.data.y3 = GUIobj.data.x.^3;
GUIobj.data.y4 = GUIobj.data.x.^0.5;
GUIobj.plotbool = false(1, length(fieldnames(GUIobj.data)));
GUIobj.fig = figure('Name', 'A Plotter', 'NumberTitle', 'off', 'MenuBar', 'none', 'ToolBar', 'none');
GUIobj.ax = axes('Parent', GUIobj.fig, 'Units', 'Normalized', 'Position', [0.35 0.1 0.60 0.8]);
GUIobj.xdropdown = uicontrol('Parent', GUIobj.fig, 'Style', 'popupmenu', 'String', 'X', ...
'Units', 'Normalized', 'Position', [0.05 0.5 0.2 0.1]);
GUIobj.ydropbutt = uicontrol('Parent', GUIobj.fig, 'Style', 'pushbutton', 'String', 'Ydata', ...
'Units', 'Normalized', 'Position', [0.05 0.4 0.2 0.08], ...
'Callback', @(h,e)GUIobj.ydatapopup());
end
function ydatapopup(GUIobj)
[selection, okbool] = listdlg('Name', 'YData', 'PromptString', 'Select Y Data to Plot', ...
'SelectionMode', 'multiple', 'ListString', fieldnames(GUIobj.data), ...
'InitialValue', find(GUIobj.plotbool));
if okbool
newplotbool = false(1, length(fieldnames(GUIobj.data)));
newplotbool(selection) = true;
GUIobj.plotbool = newplotbool;
GUIobj.updateplot()
end
end
function updateplot(GUIobj)
cla(GUIobj.ax);
hold(GUIobj.ax, 'on')
fnames = fieldnames(GUIobj.data);
for ii = 1:length(GUIobj.plotbool)
if GUIobj.plotbool(ii)
plot(GUIobj.data.x, GUIobj.data.(fnames{ii}), 'DisplayName', fnames{ii})
end
end
hold(GUIobj.ax, 'off')
legend(GUIobj.ax, 'show');
end
end
end