Matlab多选弹出菜单

时间:2017-08-11 17:42:35

标签: matlab

我使用三个弹出菜单创建了一个绘图仪:一个用于X变量,一个用于Y,一个用于图形名称。选择图形名称(编号)时,其回调函数会从X和Y弹出菜单中抓取字符串,从加载的数据集中搜索这些字符串,并在选定的图形上绘制它们。

我想要做的是在弹出菜单上进行多选。我研究了很多,并了解到弹出式菜单没有以常规记录的方式

我不想和几乎不能使用列表框的原因是我的GUI从上到下有很多面板;每个包含上面提到的三个弹出菜单。每个面板代表一个数据集。这意味着如果我选择并加载十个.MAT文件,将从上到下创建一个包含10个面板的GUI。每个数据集可以包含多达100个或更多变量。列表框的高度(显示,例如,只显示十个变量)和X(时间)10之上和之下的一些边距将创建一个基本上无法使用的巨大GUI。

我遇到了一些可能通过使用JcomboBox和一些严厉警告而工作的java脚本讨论,但我实际上并没有找到它的代码。

有办法吗?

想象一下,在下面的快照中,Y轴弹出菜单中的下拉列表实际上是一个列表框,所有面板也都有相同的高度列表框。它很难有效地使用这个工具。我想要做的是选择一个X变量,例如TIME(这是弹出菜单的方式),并能够选择多个Y变量。然后,当我选择一个图形时,绘图仪将根据所选的X变量绘制那些Y变量。我可以迭代地做到这一点。我们小组中有人要求这种能力,我正在确定其可能性 enter image description here

我整合了@excaza的想法,我很难弄清楚如何保留所选的y变量名,同时我选择一个数字来绘制它们。见下图。 enter image description here

这肯定是朝着正确的方向发展的。我现在的问题是我可以保留所选的索引信息。下面的函数是" 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);

1 个答案:

答案 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

yay