In a previous post I showed how we can create custom Matlab app toolstrips. Toolstrips can be a bit complex to develop so I’m trying to proceed slowly, with each post in the miniseries building on the previous posts. I encourage you to review the earlier posts in the Toolstrip miniseries before reading this post. Today’s post describes how we can set various icons, based on the toolstrip created in the previous posts:
Many toolstrip controls (such as buttons, but not checkboxes for example) have a settable Icon property. The standard practice is to use a 16×16 icon for a component within a multi-component toolstrip column (i.e., when 2 or 3 components are displayed on top of each other), and a 24×24 icon for a component that spans the entire column height (i.e., when the column contains only a single component).
We can use one of the following methods to specify the icon. Note that you need to
import matlab.ui.internal.toolstrip.* if you wish to use the
Icon class without the preceding package name.
- The Icon property value is typically empty (
) by default, meaning that no icon is displayed.
- We can use one of ~150 standard icons using the format
Icon.<icon-name>. For example:
icon = Icon.REFRESH_24. These icons typically come in 2 sizes: 16×16 pixels (e.g. Icon.REFRESH_16) that we can use with the small-size components (which are displayed when the column has 2-3 controls), and 24×24 pixels (e.g. REFRESH_24) that we can use with the large-size components (which are displayed when the column contains only a single control). You can see the list of the standard icons by running
- We can use the
Iconconstructor by specifying the full filepath for any PNG or JPG image file. Note that other file type (such as GIF) are not supported by this method. For example:
icon = Icon(fullfile(matlabroot,'toolbox','matlab','icons','tool_colorbar.png')); % PNG/JPG image file (not GIF!)
In fact, the ~150 standard icons above use this mechanism under the hood:
Icon.REFRESH_24is basically a public static method of the
Iconclass, which simply calls
Icon('REFRESH_24','Refresh_24')(note the undocumented use of a 2-input
Iconconstructor). This method in turn uses the Refresh_24.png file in Matlab’s standard toolstrip resources folder: %matlabroot%/toolbox/shared/controllib/general/resources/toolstrip_icons/Refresh_24.png.
- We can also use the
Iconconstructor by specifying a PNG or JPG file contained within a JAR file, using the standard
jar:file:...jar!/notation. There are numerous icons included in Matlab’s JAR files – simply open these files in WinZip or WinRar and browse. In addition, you can include images included in any external JAR file. For example:
icon = Icon(['jar:file:/' matlabroot '/java/jar/mlwidgets.jar!/com/mathworks/mlwidgets/actionbrowser/resources/uparrow.png']);
- We can also use the
Iconconstructor by specifying a Java
javax.swing.ImageIconobject. Fortunately we can create such objects from a variety of image formats (including GIFs). For example:
iconFilename = fullfile(matlabroot,'toolbox','matlab','icons','boardicon.gif'); jIcon = javax.swing.ImageIcon(iconFilename); % Java ImageIcon from file (inc. GIF) icon = Icon(jIcon);
If we need to resize the Java image (for example, from 16×16 to 24×24 or vise versa), we can use the following method:
% Resize icon to 24x24 pixels jIcon = javax.swing.ImageIcon(iconFilename); % get Java ImageIcon from file (inc. GIF) jIcon = javax.swing.ImageIcon(jIcon.getImage.getScaledInstance(24,24,jIcon.getImage.SCALE_SMOOTH)) % resize to 24x24 icon = Icon(jIcon);
App window icon
The app window’s icon can also be set. By default, the window uses the standard Matlab membrane icon (%matlabroot%/toolbox/matlab/icons/matlabicon.gif). This can be modified using the
hToolGroup.setIcon method, which currently [R2018b] expects a Java
ImageIcon object as input. For example:
iconFilename = fullfile(matlabroot,'toolbox','matlab','icons','reficon.gif'); jIcon = javax.swing.ImageIcon(iconFilename); hToolGroup.setIcon(jIcon)
This icon should be set before the toolgroup window is shown (
An odd caveat here is that the icon size needs to be 16×16 – setting a larger icon results in the icon being ignored and the default Matlab membrane icon used. For example, if we try to set ‘boardicon.gif’ (16×17) instead of ‘reficon.gif’ (16×16) we’d get the default icon instead. If our icon is too large, we can resize it to 16×16, as shown above:
% Resize icon to 16x16 pixels jIcon = javax.swing.ImageIcon(iconFilename); % get Java ImageIcon from file (inc. GIF) jIcon = javax.swing.ImageIcon(jIcon.getImage.getScaledInstance(16,16,jIcon.getImage.SCALE_SMOOTH)) % resize to 16x16 hToolGroup.setIcon(jIcon)
It’s natural to expect that
hToolGroup, which is a pure-Matlab MCOS wrapper class, would have an Icon property that accepts
Icon objects, just like for controls as described above. For some reason, this is not the case. It’s very easy to fix it though – after all, the
Icon class is little more than an MCOS wrapper class for the underlying Java
ImageIcon (not exactly, but close enough). Adapting
ToolGroup‘s code to accept an
Icon is quite easy, and I hope that MathWorks will indeed implement this in a near-term future release. I also hope that MathWorks will remove the 16×16 limitation, or automatically resize icons to 16×16, or at the very least issue a console warning when a larger icon is specified by the user. Until then, we can use the
setIcon(jImageIcon) method and take care to send it the 16×16
ImageIcon object that it expects.
Toolstrip miniseries roadmap
The next post will discuss complex components, including button-group, drop-down, listbox, split-button, slider, popup form, gallery etc.
Following that, my plan is to discuss toolstrip collapsibility, the ToolPack framework, docking layout, DataBrowser panel, QAB (Quick Access Bar), underlying Java controls, and adding toolstrips to figures – not necessarily in this order. Matlab toolstrips can be a bit complex, so I plan to proceed in small steps, each post building on top of its predecessors.
If you would like me to assist you in building a custom toolstrip or GUI for your Matlab program, please let me know.