【问题标题】:Matlab Multiple Selection Popup MenuMatlab 多选弹出菜单
【发布时间】:2017-08-11 17:42:35
【问题描述】:

我使用三个弹出菜单创建了一个绘图仪:一个用于 X 变量,一个用于 Y,一个用于图形名称。 When a figure name (number) is selected, its callback function grabs strings from X and Y popup menus, search these from a loaded dataset, and plots them on a selected figure.

我想做的是在弹出菜单上进行多项选择。我进行了相当多的研究,发现弹出菜单以常规记录方式没有这种功能。

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

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

有办法吗?

想象一下,在下面的快照中,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);

【问题讨论】:

  • 我不太明白你想要达到什么目的,有你想要的截图吗?你总是可以制作自己的弹出窗口,但这整件事听起来像是 UX 的噩梦。您真的需要为每个数据集绘制多个唯一变量,而不仅仅是跨所有数据集绘制相同的变量吗?
  • @excaza 感谢您的回复。我希望我的问题现在更清楚了。

标签: matlab


【解决方案1】:

我建议尝试使用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

【讨论】:

  • 我同意你所说的一切。让我试一试。谢谢。
  • 将选定的变量名称存储到弹出菜单对象的“Tag”属性是相当不正统的,但我认为它很聪明,我很高兴。谢谢你。效果很好。
猜你喜欢
  • 1970-01-01
  • 2013-06-17
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多