【问题标题】:Selecting Axis inside a tab group with a programmatic GUI使用编程 GUI 在选项卡组中选择轴
【发布时间】:2015-08-28 09:08:48
【问题描述】:

在 MATLAB 中使用 OOP 创建 GUI 时,我无法理解如何控制要在哪个选项卡的哪个轴中绘制数据。我附上了示例代码以帮助解决我的问题

  1. 首先,加载GUI时,只有Tab 2下的Axis 2标题为(Axis 2),代码title('Axis 1');似乎打不通。这是为什么呢?

  2. 运行代码时,默认情况下,Tab1 或 Tab2 中没有绘图。如果在 Tab1 打开时单击“Plot Data”,然后切换到 Tab2,您可以看到在 Tab2 中绘制正弦曲线。但根据我的代码,或者至少我想要做的是,正弦曲线应该出现在 Tab1 的 Axis1 中。

  3. 但是当您点击 Tab2 并点击“Plot Data”时,曲线变为指数曲线,这正是我所期望的。

我对使用 MATLA 的 OOP GUI 还是很陌生,所以我可能缺少一些简单的东西。感谢您的帮助和 cmets。

classdef example < handle

    properties
        Figure;
        TabGroupAxis;
        TabsAxis;
        Axis1;
        Axis2;

        ButtonPlotData;

        DataToPlot;
    end

    methods
        function obj = example()
            create(obj)
            makeUpData(obj);
        end

        function create(obj)
            obj.Figure = figure('Position',[300 300 640 640]);

            obj.TabGroupAxis = uitabgroup(obj.Figure,'Units','pixels','Position',[100 20 600 600]);
            obj.TabsAxis(1) = uitab(obj.TabGroupAxis,'Title','Tab1');
            obj.TabsAxis(2) = uitab(obj.TabGroupAxis,'Title','Tab2');

            obj.Axis1 = axes('Parent',obj.TabsAxis(1),'Units','pixels','Position',[30 20 500 500]);
            obj.Axis2 = axes('Parent',obj.TabsAxis(2),'Units','pixels','Position',[30 20 500 500]);

            obj.ButtonPlotData = uicontrol(obj.Figure,'Style','pushbutton','String','Plot Data',...
                'Callback',@obj.buttonPlotDataCallback);

            axis(obj.Axis1);
            title('Axis 1');

            axis(obj.Axis2);
            title('Axis 2');
        end

        function makeUpData(obj)
            obj.DataToPlot(1).x = linspace(0,2*pi);
            obj.DataToPlot(1).y = sin(obj.DataToPlot(1).x);

            obj.DataToPlot(2).x = linspace(0,2*pi);
            obj.DataToPlot(2).y = exp(obj.DataToPlot(1).x);
        end

        function buttonPlotDataCallback(obj,hObject,eventdata)
            activeTab = obj.TabGroupAxis.SelectedTab.Title;

            switch activeTab
                case 'Tab1'
                    axis(obj.Axis1);
                    plot(obj.DataToPlot(1).x,obj.DataToPlot(1).y);
                case 'Tab2'
                    axis(obj.Axis2);
                    plot(obj.DataToPlot(2).x,obj.DataToPlot(2).y);
            end
        end
    end
end

【问题讨论】:

    标签: matlab user-interface plot tabs


    【解决方案1】:

    长答案

    很好的问题,你的例子让我很容易理解这个问题。我在buttonPlotDataCallback中放了一个断点,看到switch case运行正常,问题是axis(obj.Axis1)没有改变焦点。查看文档,那是因为这不是axis 的正确用法。

    绘制函数的另一种方法是使用重载的 plot 方法

    case 'Tab1'
        plot(obj.Axis1,obj.DataToPlot(1).x,obj.DataToPlot(1).y);
    

    现在我们意识到axis1没有得到标题的原因是第34行对axis的调用也不起作用。这也可以通过重载来解决,这次是title

    title(obj.Axis1,'Axis 1');
    

    简短回答

    原来axes 完全符合您使用axis 的目的。你有一个没有被抓住的错字,因为axis 是一个有效的函数。将 axis(&lt; handle &gt;) 更改为 axes(&lt; handle &gt;) 就可以了。

    【讨论】:

      猜你喜欢
      • 2015-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多