A couple of weeks ago, a reader of this website requested an article about color-selection components. So Ed – this one’s for you 🙂
Matlab includes a fully-documented uisetcolor function to enable color selection. uisetcolor uses a modal dialog window for this. To integrate this color-selection dialog in our GUI, simply add a uicontrol button or a menu item that call uisetcolor in their callback function.
An example of such an integrated control can be found in the uisetlineprops utility on the File Exchange, which I introduced earlier this month in my article on using a borderless button for setting plot properties:
![uisetlineprops uisetlineprops](https://undocumentedmatlab.com/images/uisetlineprops.png)
Unfortunately, we often need to integrate color-selection components as a sub-component of an existing GUI, rather than as a stand-alone modal dialog window. This is not supported by uisetcolor.
Luckily, Matlab contains several internal Java-based color-selection components that can be integrated in our GUI. Being Java-based means that they work as advertised on any platform that runs Matlab. Matlab uses these components for different situations. For example,
com.mathworks.beans.editors.ColorPicker
is used by the property inspector as the editor for colors properties of Java objects, whereas Matlab color properties use another editor – com.mathworks.mlwidgets.graphics.ColorDialog
(see below).
Swing’s JColorChooser
We start with Swing’s standard JColorChooser
. This can easily be used in Matlab, just as any other Swing component. It can be added to our GUI using the built-in javacomponent function:
>> cc = javax.swing.JColorChooser; >> [jColorChooser,container] = javacomponent(cc,[1,1,450,325],gcf); >> jColorChooser.getColor ans = java.awt.Color[r=102,g=153,b=255] |
![Swing's standard JColorChooser component Swing's standard JColorChooser component](https://undocumentedmatlab.com/images/JColorChooser_animated.gif)
Note that
JColorChooser
should have a minimum size of about 425×325 pixels to appear uncropped.
Matlab ColorPicker components
com.mathworks.beans.editors.ColorPicker
is an alternative component provided by Matlab:
>> cp = com.mathworks.beans.editors.ColorPicker; >> [jColorPicker,container] = javacomponent(cp,[1,1,400,200],gcf); |
![Matlab's internal ColorPicker component Matlab's internal ColorPicker component](https://undocumentedmatlab.com/images/ColorPicker.png)
The
com.mathworks.beans.editors.ColorPicker
object should not be confused with another internal ColorPicker
object, namely com.mathworks.mlwidgets.graphics.ColorPicker
. The Beans editor ColorPicker
is a simple stand-alone Java component that can be embedded GUI figures, whereas the MLWidgets ColorPicker
is a Java button control that is used to present a popup-selection similar to a ColorDialog
(see below):
options = 0; icon = 0; cp = com.mathworks.mlwidgets.graphics.ColorPicker(options,icon,''); [jColorPicker,hContainer] = javacomponent(cp,[10,220,30,20],gcf); |
![a different Matlab ColorPicker a different Matlab ColorPicker](https://undocumentedmatlab.com/images/ColorPicker7a.png)
![a different Matlab ColorPicker a different Matlab ColorPicker](https://undocumentedmatlab.com/images/ColorPicker7b.png)
![a different Matlab ColorPicker a different Matlab ColorPicker](https://undocumentedmatlab.com/images/ColorPicker7c.png)
(note several possible button icons & popup options)
JIDE’s ColorComboBox
JIDE’s com.jidesoft.combobox.ColorComboBox
is very similar to ColorPicker
. Despite its name and appearance as a combo-box, it actually extends the basic JComponent
, not JComboBox
. It includes three separately-customizable sub-components: a color label, the color values, and the drop-down arrow button. All are shown by default (the color values may be hidden if the control is set too narrow):
![JIDE's ColorComboBox JIDE's ColorComboBox](https://undocumentedmatlab.com/images/JIDE_ColorComboBox4.png)
ColorComboBox
has a very nice feature, enabling manual modification of the color values (RGB) – the label’s color automatically changes once a new value has been entered (the <enter> key is pressed).
…and a few others
There are a few other color-selection controls. I won’t go into details here, but here are a couple of pointers to get you started:
com.mathworks.mwswing.MJColorComboBox
is a simple extension of the standard SwingJComboBox
that presents a color-selection drop-down control. Unfortunately, this control only works on Matlab releases up to 7.10 (R2010a) – it was removed in 7.11 (R2010b):
Matlab's MJColorComboBox com.mathworks.mlwidgets.graphics.ColorDialog
is the control used by Matlab for color selection in Matlab’s property inspector for Matlab handle objects. It can be displayed as either a modal dialog window or an embedded panel component:
Matlab's ColorDialog com.mathworks.hg.util.dColorChooser
is another control, which presents a panel grid of selectable colors:
Matlab's dColorChooser
Some final notes
It is fortunate to have such a wide selection of available components, although it is a pity that they are not fully documented and supported. Of course, there are many other 3rd-party color-selection components available, and these can also be integrated in your GUI – today I have only briefly discussed a few relevant built-in components.
Color-selection controls can also be embedded as sub-components in other GUI controls. For example, color-selection cells within data tables:
![Color selection table cell editor and renderer Color selection table cell editor and renderer](https://undocumentedmatlab.com/images/ColorCellEditor_Renderer.png)
A more detailed report
I have prepared a 20-page PDF report about using color-selection components in Matlab, which greatly expands on the above. This report is available for $19 here (please allow up to 48 hours for email delivery).
This info is awesome. The Beans editor
ColorPicker
is exactly what I was looking for but it’s sure nice to have all those other options as well. Thanks for responding so quickly to my request!thanks…..will be looking to paste question if i am not able to make a child components in parent gui………..really good one bydave…….
Wonderful post!!
Hi.
I’m always find information in your Blog.
ans also read this page. but I don’t know how to get color info
in “com.mathworks.mlwidgets.graphics.ColorPicker”.
I’d like get color info same to get “uigetcolor”.
How to get it?
and I’d like set default color…
It like System Test Tool box “Plot – General”.
@Kim –
More information about
ColorPicker
, including its options and icons styles, can be found in section 5.4.1 of my Matlab-Java book.Thank you so much!!
It’s working now!
Your amazing guy!!
Is it possible with some script or ui to edit the predefined colors that all the above mentioned color-selection tools seem to have in common? I personally dont ever use any other colors than given in the first 4 lines (white to black, red1… , red2…, and the one with green in it ). So the last 5 lines are just crap. Id really love to change them into more useful colors.
Thanks in advance
@ronin – I am not aware of a way to do this.
Hi, I find your advice absolutely wonderful.
However I can’t find a way to retrieve colour information from the
com.mathworks.beans.editors.ColorPicker
object (used as in example), even with your Red Kim answer.Would you have any idea why ?
@Paul – you can use the following object methods to retrieve the
com.mathworks.beans.editors.ColorPicker
‘s selected color:* getBlue() % returns int
* getGreen() % returns int
* getRed() % returns int
* getSelectedColor() % returns java.awt.Color
Red Kim referred to a different
ColorPicker
class (that happens to have the same class name), but it’s a different class in a different package so of course it has different behavior.Yair,
Another super useful post I’m just now finding!
I have embedded this color picker within a context menu of a GUI I’ve built.
My question is this:
Is it possible to trigger a callback when the user clicks ‘OK’ in the widget?
Using the code snippet you provided for @Red Kim, hopefully my intention is clear.
Thanks so much for all the great insights.
Best,
meade
Yair,
I figured out my request. Posting it here for anyone else who may be curious.
Thanks again!
Meade