- Undocumented Matlab - https://undocumentedmatlab.com -

Color selection components

Posted By Yair Altman On May 30, 2011 | 12 Comments

A couple of weeks ago, a reader of this website requested [1] 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 [2] utility on the File Exchange, which I introduced earlier this month in my article on using a borderless button for setting plot properties [3]:

uisetlineprops
uisetlineprops

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 [4]. 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 [5]:

>> 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

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

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 a different Matlab ColorPicker  
a different Matlab ColorPicker
(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

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 Swing JComboBox 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
    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
    Matlab's ColorDialog
  • com.mathworks.hg.util.dColorChooser is another control, which presents a panel grid of selectable colors:
    Matlab's dColorChooser
    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

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 [6] (please allow up to 48 hours for email delivery).

Categories: GUI, Java, Medium risk of breaking in future versions, Undocumented feature


12 Comments (Open | Close)

12 Comments To "Color selection components"

#1 Comment By Ed Ross On June 3, 2011 @ 11:46

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!

#2 Comment By dhruv jain On June 16, 2011 @ 07:34

thanks…..will be looking to paste question if i am not able to make a child components in parent gui………..really good one bydave…….

#3 Comment By Jesse dziedzic On October 20, 2011 @ 08:47

Wonderful post!!

#4 Comment By Red Kim On May 13, 2012 @ 23:29

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”.

#5 Comment By Yair Altman On May 13, 2012 @ 23:46

@Kim –

import com.mathworks.mlwidgets.graphics.ColorPicker
cp = ColorPicker(ColorPicker.AUTO, ColorPicker.LINE_ICON, '');
[jcp,hcontainer] = javacomponent(cp,[],gcf);
color = cp.getValue;  % a java.awt.Color object
color = cp.getValue.getColorComponents([])' * 255;   % an [R,G,B] array of values

More information about ColorPicker, including its options and icons styles, can be found in section 5.4.1 of my [13].

#6 Comment By Red Kim On May 14, 2012 @ 03:50

Thank you so much!!
It’s working now!
Your amazing guy!!

#7 Comment By Ronin On July 1, 2014 @ 02:14

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

#8 Comment By Yair Altman On July 2, 2014 @ 09:51

@ronin – I am not aware of a way to do this.

#9 Comment By Paul On October 13, 2015 @ 04:48

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 ?

#10 Comment By Yair Altman On October 13, 2015 @ 12:58

@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.

#11 Comment By Meade On February 22, 2017 @ 18:14

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

import com.mathworks.mlwidgets.graphics.ColorPicker
cp = ColorPicker(ColorPicker.AUTO, ColorPicker.LINE_ICON, '');
[jcp,hcontainer] = javacomponent(cp,[],gcf);   % Need to trigger callback on selection here!

% function MyCallback(hObj,evt)
color = cp.getValue;  % a java.awt.Color object % This should be within the callback
color = cp.getValue.getColorComponents([])' * 255;   % an [R,G,B] array of values
% Do something with the color
% end %MyCallback

#12 Comment By meade On March 3, 2017 @ 21:28

Yair,

I figured out my request. Posting it here for anyone else who may be curious.

Thanks again!
Meade

 import com.mathworks.mlwidgets.graphics.ColorPicker
 cp = ColorPicker(ColorPicker.AUTO, ColorPicker.LINE_ICON, '');
 [jcp,hcontainer] = javacomponent(cp,[],gcf);
 
 % !! Here's the key bit... This will trigger when user picks a color & selects "OK" in widget
 set(jcp, 'ItemStateChangedCallback', {@MyCallback,gcf})


 function MyCallback(hObj,evt,hFigure)
      color = cp.getValue;  % a java.awt.Color object % This should be within the callback
      color = cp.getValue.getColorComponents([])' * 255;   % an [R,G,B] array of values
      % Do something with the color
 end %MyCallback

Article printed from Undocumented Matlab: https://undocumentedmatlab.com

URL to article: https://undocumentedmatlab.com/articles/color-selection-components

URLs in this post:

[1] requested: http://undocumentedmatlab.com/todo/#comment-43453

[2] uisetlineprops: http://www.mathworks.cn/matlabcentral/fileexchange/14143-uisetlineprops

[3] using a borderless button for setting plot properties: http://undocumentedmatlab.com/blog/borderless-button-used-for-plot-properties/

[4] JColorChooser: http://download.oracle.com/javase/tutorial/uiswing/components/colorchooser.html

[5] javacomponent function: http://undocumentedmatlab.com/blog/javacomponent/

[6] here: https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=altmany@gmail.com&currency_code=USD&amount=19&return=&item_name=Matlab-color-selection-report

[7] Date selection components : https://undocumentedmatlab.com/articles/date-selection-components

[8] Font selection components : https://undocumentedmatlab.com/articles/font-selection-components

[9] Plot-type selection components : https://undocumentedmatlab.com/articles/plot-type-selection-components

[10] Javacomponent background color : https://undocumentedmatlab.com/articles/javacomponent-background-color

[11] Setting status-bar components : https://undocumentedmatlab.com/articles/setting-status-bar-components

[12] Figure toolbar components : https://undocumentedmatlab.com/articles/figure-toolbar-components

[13] : https://undocumentedmatlab.com/matlab-java-book/

Copyright © Yair Altman - Undocumented Matlab. All rights reserved.