如何在图形上添加“ tutorial message div”?

时间:2018-11-19 15:59:14

标签: matlab flexbox matlab-figure matlab-gui undocumented-behavior

安装R2018b后,我打开的第一个数字包含一条有趣的消息(以蓝色显示):

Static image

之所以有趣,是因为它包含诸如文本换行,透明性,即使文本调整大小后图像仍保持恒定宽度的功能(这使我想起了CSS3 flexbox,因此还有标签)等。

Animation

动画的最后一部分是慢动作,以更好地显示div的大小如何跟随图形的大小。

如果有问题,我正在使用Win 10 v1803。

问题:

我想知道我们如何在我们的图形中绘制相似的,自定义的 div (由于缺少更好的用词) >。 (必须强调的是,这不是不是 UIFigure!)


到目前为止我发现了什么

  • Learn More链接打开页面:

    web(fullfile(docroot, 'matlab/creating_plots/interactively-explore-plotted-data.html'))
    

    尚未击中webdocroot(甚至doc)入口点的断点。

  • 假定此元素是图中的Child,我试图为其找到一个句柄:

    >> set(gcf,'MenuBar','none'); findall(gcf)
    
    ans = 
      22×1 graphics array:
    
      Figure                (1)
      ContextMenu
      AnnotationPane
      Axes
      AxesToolbar
      Text
      Text
      Text
      ToolbarStateButton    (Brush/Select Data)
      ToolbarStateButton    (Data Tips)
      ToolbarStateButton    (Rotate 3-D)
      ToolbarStateButton    (Pan)
      ToolbarStateButton    (Zoom In)
      ToolbarStateButton    (Zoom Out)
      ToolbarPushButton     (Restore View)
      Button
      Button
      Button
      Button
      Button
      Button
      Button
    

    但是,使用set(h(2:end), 'Visible', false)使这些控件不可见并不能使div消失。

  • 将图形另存为.fig或为其生成代码,不会留下该div的任何痕迹。

  • uiinspect-指向数字时,此div不会显示(或至少 I 找不到)。

  • 我不知道该怎么做才能使其再次出现,但是由于它设置为首次启动R2018b时出现,因此我怀疑删除了prefdir(显然,在备份之后并重新启动MATLAB可以将其恢复。

  • 我唯一没有尝试过的就是将Java调试器附加到MATLAB,并尝试将调用方跟踪到com.mathworks.mlservices.MLHelpServices.setCurrentLocation(来自mlservices.jar),这将打开帮助浏览器。

1 个答案:

答案 0 :(得分:7)

深入研究Java方面(从findjobj开始,接着是许多.getComponent(0).getComponent(0)...)之后,我终于设法找到了有问题的组件。这是我学到的:

  1. 该组件称为InfoPanel,是MATLAB Java API的一部分。类定义本身位于:

    MATLAB/R2018b/java/jar/hg.jar!/com/mathworks/hg/util/InfoPanel.class
    
  2. 要使其显示,我们需要调用static方法addBannerPanel,并传递图形句柄:

    com.mathworks.hg.util.InfoPanel.addBannerPanel( figure(randi(1E4)) );
    

    或另一个也接受自定义面板的签名:

    jIP = com.mathworks.hg.util.InfoPanel;
    jIP.setBackground(java.awt.Color(0.8, 0.7, 0.1));
    com.mathworks.hg.util.InfoPanel.addBannerPanel( figure(randi(1E4)), jIP );
    
  3. 用于控制是否应显示的MATLAB设置是位于showinteractioninfobar XML内的<prefdir>/matlab.settings

  4. 看来InfoPanel的“有趣部分”是私有的,这意味着它几乎不允许进行任何自定义(主要是某些颜色;不是字符串或图标),但是应该相当容易复制该类并暴露我们需要的所有元素。