It is often useful to include hyperlinked text labels in GUIs. Such labels provide single-click access to important functionality, improve branding, and are non-intrusive action controls having a lower visual impact than a full-blown button. There are several ways that we can display such hyperlinks in Matlab GUIs, and today I will show one of my favorites.
The basic idea is to create a Java text label control whose label displays an HTML link. The control is modified to change the mouse cursor when it hovers over the hyperlink, and a mouse-click callback is set to open the hyperlink target in the system browser:
% Create and display the text label url = 'UndocumentedMatlab.com'; labelStr = ['<html>More info: <a href="">' url '</a></html>']; jLabel = javaObjectEDT('javax.swing.JLabel', labelStr); [hjLabel,hContainer] = javacomponent(jLabel, [10,10,250,20], gcf); % Modify the mouse cursor when hovering on the label hjLabel.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.HAND_CURSOR)); % Set the label's tooltip hjLabel.setToolTipText(['Visit the ' url ' website']); % Set the mouse-click callback set(hjLabel, 'MouseClickedCallback', @(h,e)web(['http://' url], '-browser')) |
Note the visual illusion here: we do not directly click the hyperlink (note that its href
is empty), but rather the label control. The end-result is the same.
Also note that this technique could be used to easily display clickable icons/images, including animated and transparent GIFs, by simply setting the label’s HTML string to display the relevant image. I have already shown how to do this in another post. Uses could range from clickable logo images to clickable help icons.
We could also use a flat (borderless) button. I have already posted related articles about button customizations in Matlab GUIs (here, here and here). In fact, I have already shown how we can use borderless buttons in Matlab axes to display a non-obtrusive control for controlling plot properties. The code would be very similar to the above, except that we would use a JButton
rather than a JLabel
, and also need to setBorder([]) and similar button-specific modifications. Buttons have a bit more functionality and customizability than simple text labels; the appearance would be the same, but the extra customizability may be handy in very special cases, although not for most use-cases.
One of the benefits of using either JLabels
or JButtons
is that they enable multiple callbacks (e.g., FocusGained,FocusLost
) and properties (e.g., VerticalAlignment,ToolTipText
) that the standard Matlab text uicontrol does not provide (not to mention their builtin ability to display HTML, which Matlab’s uicontrol text labels do not posses).
Hi,
Apparently, there is a typo in the 3rd line of the code; it should read:
Thanks Don, corrected
hi, but how to connect the code with the label ??
@oussama – read the post carefully. I showed how you can attach Matlab code to the label’s MouseClickedCallback property. You can attach any Matlab callback function that accepts 2 input args (the label object handle and the eventData object).
Thanks for kind useful information.