advanced matlab gui - john...

28
Advanced Matlab GUI Open Day – Jan 8, 2013 © Yair Altman www.UndocumentedMatlab.com 1 http://UndocumentedMatlab.com/files/OpenDay.zip

Upload: buithien

Post on 10-Apr-2018

323 views

Category:

Documents


9 download

TRANSCRIPT

Page 1: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

Advanced Matlab GUI

Open Day – Jan 8, 2013

© Yair Altman www.UndocumentedMatlab.com 1

http://UndocumentedMatlab.com/files/OpenDay.zip

Page 2: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

GUIDE: Graphical User Interface Design Env

© Yair Altman www.UndocumentedMatlab.com 2

Page 3: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

GUIDE: Creating a simple GUI

>> guide

© Yair Altman www.UndocumentedMatlab.com 3

drag &

drop

Double

click to

customize

Page 4: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

Available uicontrols

• Push-button

• Slider (scrollbar)

• Radio button

• Checkbox

• Editbox

• Text label

• Popup menu (combo-box, drop-down)

• Listbox

• Toggle button

• Uitable (R2008a+)

• Plot axes

• Panel

• Button group

• ActiveX control

© Yair Altman www.UndocumentedMatlab.com 4

Page 5: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

Advanced GUI topics

• The GUIDE-generated file duo

• OpeningFcn vs. OutputFcn

• Setting and using callbacks

• Callback event handling, reentrancy, dynamic data

• The hObject parameter

• The eventdata parameter

• The handles struct

• guihandles vs. guidata

• Controlling handles visibility © Yair Altman www.UndocumentedMatlab.com 5

Page 6: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

Using HTML

• All Matlab GUI is based on Java Swing o Java Swing supports HTML labels + extensive CSS subset

• HTML processing is CPU intensive – bad for performance o Especially bad if recurring multiple times (table/listbox cells)

Use only if <20-30 elements

o Alternatives: built-in Font* properties; Java cell renderers

• Case-insensitive HTML tags, attributes

• Required: <html> prefix at the string's beginning

• Not required: closing tags (</b></font></html>)

• Note: HTML processing may modify some display aspects o Font, background color, label margins (visible in tooltips)

© Yair Altman www.UndocumentedMatlab.com 6

Page 7: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

Using HTML – some examples

• Listbox uicontrol('Style','list', 'Position',[10,10,70,70], 'String', ...

{'<HTML><FONT color="red">Hello</Font></html>', 'world', ...

'<html><font style="font-family:impact;color:green"><i>What a', ...

'<Html><FONT color="blue" face="Comic Sans MS">nice day!</font>'});

• Combo-box uicontrol('Style','popup', 'Position',[10,10,150,100], 'String', ...

{'<HTML><BODY bgcolor="green">green background</BODY></HTML>', ...

'<HTML><FONT color="red" size="+2">Large red font</FONT></HTML>', ...

'<HTML><BODY bgcolor="#FF00FF"><PRE>fixed-width font'});

© Yair Altman www.UndocumentedMatlab.com 7

Page 8: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

Using HTML – some examples

• Fonts in combo-box fontStr = @(font) ['<html><font face="' font '">' font '</font></html>'];

htmlStr = cellfun(fontStr,listfonts,'uniform',false);

uicontrol('style','popupmenu', 'string',htmlStr, 'pos',[20,350,60,20]);

© Yair Altman www.UndocumentedMatlab.com 8

Page 9: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

Using HTML images

• HTML img src must have full pathname in URI format: >> uicontrol('Position',..., 'String','<Html><img src="img.gif">');

>> uicontrol('Style','list', ... '<Html><img src="img.gif"/>'});

>> iconsFolder = fullfile(matlabroot,'/toolbox/matlab/icons/');

>> iconUrl = strrep(['file:/' iconsFolder 'matlabicon.gif'],'\','/');

>> str = ['<Html><img src="' iconUrl '">']

str = <Html><img src="file:/C:/Program Files/MATLAB/.../icons/matlabicon.gif">

>> uicontrol('Position',..., 'String',str);

>> uicontrol('Style','list', ... str});

© Yair Altman www.UndocumentedMatlab.com 9

Page 10: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

Using HTML images

• HTML images can also be placed in tooltips: filePath = 'C:\Yair\Undocumented Matlab\Images\table.png';

str = ['<html><center><img src="' filePath '"><br>' filePath];

set(hButton,'tooltipString',str);

filePath = 'C:\Yair\Undocumented Matlab\Images\family.jpg';

filePath = strrep(['file:/' filePath],'\','/');

str = ['<html><center><img src="' filePath '"><br>' ...

'<b><font color="blue">' filePath];

set(hButton,'tooltipString',str);

© Yair Altman www.UndocumentedMatlab.com 10

Page 11: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

Hidden properties

• Most Matlab graphics components (GUI, plots, …) have hidden unsupported/undocumented properties

• These properties behave exactly like regular properties, except that they are not displayed by default in get/set

• To display these properties: o set(0,'HideUndocumented','off'); % default='on'

o HideUndocumented is itself a hidden property…

o Or use the FEX: getundoc utility (32934)

• Some hidden properties have no effect, some are useful o scatter-plot Jitter, plot LineSmoothing, axes LooseInset, figure JavaFrame

‼ Hidden properties are unsupported and may be removed in any future Matlab release without prior notice

© Yair Altman www.UndocumentedMatlab.com 11

Page 12: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

Hidden property example – LineSmoothing

undocumentedmatlab.com/blog/plot-linesmoothing-property/

www.mathworks.com/matlabcentral/fileexchange/20979-Myaa

© Yair Altman www.UndocumentedMatlab.com 12

Page 13: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

Displaying data in a uitable

>> data = rand(3);

>> headers = {'X-Data', 'Y-Data', 'Z-Data'};

>> rowNames = {'First', 'Second', 'Third'};

>> hTable = uitable('Parent',gcf, ...

'Data',data, ...

'Pos',[20,0,360,90], ...

'ColumnName',headers, ...

'RowName',rowNames);

© Yair Altman www.UndocumentedMatlab.com 13

Page 14: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

Customizing uitable appearance

>> set(h,'ColumnWidth',{25})

>> set(h,'ColumnWidth',{45,60,35,80})

>> set(h,'BackgroundColor',[.4,.7,.3])

>> set(h,'ForegroundColor',[.2,.3,.8])

>> set(h,'RowStriping','off')

>> set(h,'RearrangeableColumns','on')

© Yair Altman www.UndocumentedMatlab.com 14

Page 15: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

HTML support

>> data{2,2} = '<html><b><i><font color="red" size=+1>big red'

data =

[6.125] [ 456.3457] [1] 'Fixed'

[ 6.75] '<html><b><i><font color="red" size=+1>big red' [0] 'Adjustable'

[ 7] [ 658.2] [0] 'Fixed'

>> set(h,'Data',data)

>> tooltipStr = '<html><b>line #1</b><br><font color="red"><i>line #2';

>> set(h,'TooltipString',tooltipStr)

© Yair Altman www.UndocumentedMatlab.com 15

Page 16: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

• Sorting and filtering

• Customized cell renderer

• Customized cell editor

Advanced customizations using Java

© Yair Altman www.UndocumentedMatlab.com 16

Page 17: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

Java components in Matlab figure

© Yair Altman www.UndocumentedMatlab.com 17

Page 18: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

Java components in Matlab figure

© Yair Altman www.UndocumentedMatlab.com 18

FEX: SpinnerDemo (#26970)

Page 19: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

Feedback for long-duration tasks

• FEX: Statusbar (#14773):

• An indeterminate progress bar (JProgressBar):

© Yair Altman www.UndocumentedMatlab.com 19

Page 20: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

Matlab's slider uicontrol

• Continuous dragging callback possible via handle.listener hListener = handle.listener(hSlider,'ActionEvent',@myCbFcn);

• The standard Matlab slider uicontrol is actually a scrollbar with Windows-95 look-and-feel: jScrollbar = javaObjectEDT(javax.swing.JScrollBar);

jScrollbar.setOrientation(jScrollbar.HORIZONTAL);

javacomponent(jScrollbar,[10,40,200,20]);

uicontrol('style','slider', 'position',[10,10,200,20]);

• An actual Java slider: jSlider = javaObjectEDT(javax.swing.JSlider);

set(jSlider, 'Value',22, 'MajorTickSpacing',20, 'PaintTicks',true);

jSlider.setPaintLabels(true); % or: jSlider.setPaintLabels(1);

© Yair Altman www.UndocumentedMatlab.com 20

JScrollBar

uicontrol('slider')

Page 21: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

Example: mwswing CheckBoxTree import com.mathworks.mwswing.checkboxtree.*

jRoot = DefaultCheckBoxNode('Root');

l1a = DefaultCheckBoxNode('Letters'); jRoot.add(l1a);

l1b = DefaultCheckBoxNode('Numbers'); jRoot.add(l1b);

l2a = DefaultCheckBoxNode('A'); l1a.add(l2a);

l2b = DefaultCheckBoxNode('b'); l1a.add(l2b);

l2c = DefaultCheckBoxNode('<html><b>&alpha;'); l1a.add(l2c);

l2d = DefaultCheckBoxNode('<html><i>&beta;'); l1a.add(l2d);

l2e = DefaultCheckBoxNode('3.1415'); l1b.add(l2e);

% Present the standard MJTree:

jTree = com.mathworks.mwswing.MJTree(jRoot);

jScrollPane = com.mathworks.mwswing.MJScrollPane(jTree);

[jComp,hc]=javacomponent(jScrollPane,[10,10,120,110],gcf);

% Now present the CheckBoxTree:

jCheckBoxTree = CheckBoxTree(jTree.getModel);

jScrollPane = com.mathworks.mwswing.MJScrollPane(jCheckBoxTree);

[jComp,hc]=javacomponent(jScrollPane,[150,10,120,110],gcf);

© Yair Altman www.UndocumentedMatlab.com 21

Page 22: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

Color-selection combo-boxes • com.mathworks.mlwidgets.graphics.ColorPicker:

• com.jidesoft.combobox.ColorComboBox:

• com.mathworks.mwswing.MJColorComboBox (R2010a-):

© Yair Altman www.UndocumentedMatlab.com 22

Page 23: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

JIDE date-chooser components

© Yair Altman www.UndocumentedMatlab.com 23

DateChooserPanel MonthChooserPanel

CalendarViewer

DateComboBox DateSpinnerComboBox MonthComboBox

Page 24: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

Sample Java integrated in Matlab GUI

© Yair Altman www.UndocumentedMatlab.com 24

Page 26: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

Integrating 3rd-party libs: JFreeChart

© Yair Altman www.UndocumentedMatlab.com 26

Page 27: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

Integrating 3rd-party libs: ImageJ

© Yair Altman www.UndocumentedMatlab.com 27

Page 28: Advanced Matlab GUI - John Brycemarketing.johnbryce.co.il/ad/Thank_You_Mail/matlab/Matlab_GUI.pdf · Advanced Matlab GUI Open Day – Jan 8, 2013 ... •All Matlab GUI is based on

Conclusion

• Standard Matlab GUI is easy to set-up but limited

• However, extremely easy to customize & extend

• Multiple undocumented properties, functions enable nice customizations, even without Java

• Entire power of Java is also directly available, and can be combined with regular Matlab GUI

• Matlab GUI is limited by our design imagination more than by actual technical limitations

© Yair Altman www.UndocumentedMatlab.com 28