diff --git a/src/controlP5/CheckBox.java b/src/controlP5/CheckBox.java index 1d9accd..38ea5df 100755 --- a/src/controlP5/CheckBox.java +++ b/src/controlP5/CheckBox.java @@ -1,5 +1,3 @@ -package controlP5; - /** * controlP5 is a processing gui library. * @@ -25,12 +23,15 @@ package controlP5; * */ -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; -import processing.core.PImage; +package controlP5; +import java.lang.reflect.Method; + +import java.util.List; +import java.util.ArrayList; + +import processing.core.PImage; +import static processing.core.PApplet.min; /** * A multiple-choice radioButton. items are added to a checkBox and can be organized in rows and @@ -43,9 +44,23 @@ import processing.core.PImage; */ public class CheckBox extends ControlGroup< CheckBox > { - private Object _myPlug; + final protected List< Toggle > _myRadioToggles = new ArrayList< >( ); - private String _myPlugName; + final protected PImage[] images = new PImage[ 3 ]; + final protected boolean[] availableImages = new boolean[ 3 ]; + + protected int spacingRow = 1; + protected int spacingColumn = 1; + protected int itemsPerRow = -1; + + protected int itemHeight = 9; + protected int itemWidth = 9; + + protected boolean noneSelectedAllowed = true; + protected boolean isMultipleChoice; + + protected Object _myPlug; + protected String _myPlugName; /** * Convenience constructor to extend CheckBox. @@ -56,7 +71,7 @@ public class CheckBox extends ControlGroup< CheckBox > { */ public CheckBox( ControlP5 theControlP5 , String theName ) { this( theControlP5 , theControlP5.getDefaultTab( ) , theName , 0 , 0 ); - theControlP5.register( theControlP5.papplet , theName , this ); + cp5.register( cp5.papplet , theName , this ); } /** @@ -69,34 +84,29 @@ public class CheckBox extends ControlGroup< CheckBox > { * @param theX * @param theY */ - public CheckBox( final ControlP5 theControlP5 , final ControllerGroup< ? > theParent , final String theName , final int theX , final int theY ) { + public CheckBox( ControlP5 theControlP5 , ControllerGroup< ? extends ControllerGroup< ? > > theParent , + String theName , int theX , int theY ) { super( theControlP5 , theParent , theName , theX , theY , 99 , 9 ); - isBarVisible = false; - isCollapse = false; - _myRadioToggles = new ArrayList< Toggle >( ); - setItemsPerRow( 1 ); + isCollapse = isBarVisible = false; isMultipleChoice = true; - _myPlug = cp5.papplet; - _myPlugName = getName( ); - if ( !ControllerPlug.checkPlug( _myPlug , _myPlugName , new Class[] { float[].class } ) ) { - _myPlug = null; - } + setItemsPerRow( 1 ); + if ( ControllerPlug.checkPlug( cp5.papplet , _myPlugName = getName( ) , + new Class[] { float[].class } ) ) _myPlug = cp5.papplet; } - public final CheckBox activateAll( ) { - int n = _myRadioToggles.size( ); - for ( int i = 0 ; i < n ; i++ ) { - _myRadioToggles.get( i ).activate( ); + public CheckBox activateAll( ) { + if ( !_myRadioToggles.isEmpty( ) ) synchronized ( _myRadioToggles ) { + for ( final Toggle tog : _myRadioToggles ) tog.activate( ); + updateValues( ); } - updateValues( ); return this; } /** * Activates a single checkbox item by index */ - public final CheckBox activate( int theIndex ) { - if ( theIndex < _myRadioToggles.size( ) ) { + public CheckBox activate( int theIndex ) { + if ( ( theIndex = Math.abs( theIndex ) ) < _myRadioToggles.size( ) ) { _myRadioToggles.get( theIndex ).activate( ); updateValues( ); } @@ -104,10 +114,10 @@ public class CheckBox extends ControlGroup< CheckBox > { } /** - * deactivate a single checkbox item by index + * Deactivates a single checkbox item by index */ - public final CheckBox deactivate( int theIndex ) { - if ( theIndex < _myRadioToggles.size( ) ) { + public CheckBox deactivate( int theIndex ) { + if ( ( theIndex = Math.abs( theIndex ) ) < _myRadioToggles.size( ) ) { _myRadioToggles.get( theIndex ).deactivate( ); updateValues( ); } @@ -115,51 +125,40 @@ public class CheckBox extends ControlGroup< CheckBox > { } /** - * toggle a single checkbox item by index + * Toggles a single checkbox item by index */ - public final CheckBox toggle( int theIndex ) { - if ( theIndex < _myRadioToggles.size( ) ) { - Toggle t = _myRadioToggles.get( theIndex ); - if ( t.getState( ) == true ) { - t.deactivate( ); - } else { - t.activate( ); - } + public CheckBox toggle( int theIndex ) { + if ( ( theIndex = Math.abs( theIndex ) ) < _myRadioToggles.size( ) ) { + final Toggle tog = _myRadioToggles.get( theIndex ); + if ( tog.getState( ) ) tog.deactivate( ); + else tog.activate( ); updateValues( ); } return this; } /** - * deactivate a single checkbox item by name + * Toggles a single checkbox item by name */ - public final void toggle( String theName ) { - int n = _myRadioToggles.size( ); - for ( int i = 0 ; i < n ; i++ ) { - Toggle t = _myRadioToggles.get( i ); - if ( theName.equals( t.getName( ) ) ) { - if ( t.getState( ) == true ) { - t.deactivate( ); - } else { - t.activate( ); - } - updateValues( ); - return; + public CheckBox toggle( final String theName ) { + if ( theName != null && !_myRadioToggles.isEmpty( ) ) synchronized ( _myRadioToggles ) { + for ( final Toggle tog : _myRadioToggles ) if ( theName.equals( tog.getName( ) ) ) { + if ( tog.getState( ) ) tog.deactivate( ); + else tog.activate( ); + return updateValues( ); } } + return this; } /** * Activates a single checkbox item by name */ - public final CheckBox activate( String theName ) { - int n = _myRadioToggles.size( ); - for ( int i = 0 ; i < n ; i++ ) { - Toggle t = _myRadioToggles.get( i ); - if ( theName.equals( t.getName( ) ) ) { - t.activate( ); - updateValues( ); - return this; + public CheckBox activate( final String theName ) { + if ( theName != null && !_myRadioToggles.isEmpty( ) ) synchronized ( _myRadioToggles ) { + for ( final Toggle tog : _myRadioToggles ) if ( theName.equals( tog.getName( ) ) ) { + tog.activate( ); + return updateValues( ); } } return this; @@ -168,40 +167,46 @@ public class CheckBox extends ControlGroup< CheckBox > { /** * Deactivates a single checkbox item by name */ - public final CheckBox deactivate( String theName ) { - int n = _myRadioToggles.size( ); - for ( int i = 0 ; i < n ; i++ ) { - Toggle t = _myRadioToggles.get( i ); - if ( theName.equals( t.getName( ) ) ) { - t.deactivate( ); - updateValues( ); - return this; + public CheckBox deactivate( final String theName ) { + if ( theName != null && !_myRadioToggles.isEmpty( ) ) synchronized ( _myRadioToggles ) { + for ( final Toggle tog : _myRadioToggles ) if ( theName.equals( tog.getName( ) ) ) { + tog.deactivate( ); + return updateValues( ); } } return this; } - private final void updateValues( ) { + @ControlP5.Invisible protected CheckBox updateValues( ) { _myValue = -1; - updateValues( true ); + return updateValues( true ); + } + + protected CheckBox updateValues( final boolean theBroadcastFlag ) { + if ( _myRadioToggles.isEmpty( ) ) _myArrayValue = new float[ 0 ]; + else synchronized ( _myRadioToggles ) { + int i = 0 , len = _myRadioToggles.size( ); + _myArrayValue = new float[ len ]; + for ( final Toggle tog : _myRadioToggles ) _myArrayValue[ i++ ] = tog.getValue( ); + } + if ( theBroadcastFlag ) cp5.getControlBroadcaster( ).broadcast( new ControlEvent( this ) , FLOAT ); + return this; } /** * Sets the value for all CheckBox items according to the values of the array passed on. 0 will * turn off an item, any other value will turn it on. */ - @Override public CheckBox setArrayValue( float[] theArray ) { - for ( int i = 0 ; i < theArray.length ; i++ ) { - if ( _myArrayValue[ i ] != theArray[ i ] ) { - if ( theArray[ i ] == 0 ) { - _myRadioToggles.get( i ).deactivate( ); - } else { - _myRadioToggles.get( i ).activate( ); - } + @Override @SafeVarargs public final T setArrayValue( final float... theArray ) { + if ( theArray != null && !_myRadioToggles.isEmpty( ) ) synchronized ( _myRadioToggles ) { + final int len = min( theArray.length , _myArrayValue.length , _myRadioToggles.size( ) ); + for ( int i = 0 ; i < len ; ++i ) if ( theArray[ i ] != _myArrayValue[ i ] ) { + if ( theArray[ i ] == 0 ) _myRadioToggles.get( i ).deactivate( ); + else _myRadioToggles.get( i ).activate( ); } + super.setArrayValue( theArray ); } - super.setArrayValue( theArray ); - return this; + return me; } /** @@ -211,46 +216,16 @@ public class CheckBox extends ControlGroup< CheckBox > { return "type:\tCheckBox\n" + super.getInfo( ); } - /** - * @exclude {@inheritDoc} - */ - @Override public String toString( ) { - return super.toString( ); - } - - protected List< Toggle > _myRadioToggles; - - protected int spacingRow = 1; - - protected int spacingColumn = 1; - - protected int itemsPerRow = -1; - - protected boolean isMultipleChoice; - - protected int itemHeight = 9; - - protected int itemWidth = 9; - - protected boolean[] availableImages = new boolean[ 3 ]; - - protected PImage[] images = new PImage[ 3 ]; - - protected boolean noneSelectedAllowed = true; - /** * @param theName * @param theValue * @return */ public CheckBox addItem( final String theName , final float theValue ) { - Toggle t = cp5.addToggle( theName , 0 , 0 , itemWidth , itemHeight ); + final Toggle t = cp5.addToggle( theName , 0 , 0 , itemWidth , itemHeight ); t.getCaptionLabel( ).align( RIGHT_OUTSIDE , CENTER ).setPadding( Label.paddingX , 0 ); - t.setMode( ControlP5.DEFAULT ); - t.setImages( images[ 0 ] , images[ 1 ] , images[ 2 ] ); - t.setSize( images[ 0 ] ); - addItem( t , theValue ); - return this; + t.setMode( ControlP5.DEFAULT ).setImages( images ); + return addItem( t , theValue ); } /** @@ -259,11 +234,11 @@ public class CheckBox extends ControlGroup< CheckBox > { * @return */ public CheckBox addItem( final Toggle theToggle , final float theValue ) { - theToggle.setGroup( this ); - theToggle.isMoveable = false; - theToggle.setInternalValue( theValue ); - theToggle.isBroadcast = false; - _myRadioToggles.add( theToggle ); + theToggle.isBroadcast = theToggle.isMoveable = false; + theToggle.setGroup( this ).setInternalValue( theValue ); + synchronized ( _myRadioToggles ) { + _myRadioToggles.add( theToggle ); + } updateLayout( ); getColor( ).copyTo( theToggle ); theToggle.addListener( this ); @@ -276,14 +251,16 @@ public class CheckBox extends ControlGroup< CheckBox > { * @param theName */ public CheckBox removeItem( final String theName ) { - int n = _myRadioToggles.size( ); - for ( int i = 0 ; i < n ; i++ ) { - if ( ( _myRadioToggles.get( i ) ).getName( ).equals( theName ) ) { - ( _myRadioToggles.get( i ) ).removeListener( this ); - _myRadioToggles.remove( i ); + if ( theName != null && !_myRadioToggles.isEmpty( ) ) synchronized ( _myRadioToggles ) { + for ( int i = _myRadioToggles.size( ) ; i-- != 0 ; ) { + final Toggle tog = _myRadioToggles.get( i ); + if ( theName.equals( tog.getName( ) ) ) { + tog.removeListener( this ); + _myRadioToggles.remove( i ); + } } + updateValues( false ); } - updateValues( false ); return this; } @@ -295,10 +272,7 @@ public class CheckBox extends ControlGroup< CheckBox > { * @return CheckBox */ public CheckBox setImages( PImage theDefaultImage , PImage theOverImage , PImage theActiveImage ) { - setImage( theDefaultImage , DEFAULT ); - setImage( theOverImage , OVER ); - setImage( theActiveImage , ACTIVE ); - return this; + return setImage( theDefaultImage ).setImage( theOverImage , OVER ).setImage( theActiveImage , ACTIVE ); } /** @@ -315,13 +289,11 @@ public class CheckBox extends ControlGroup< CheckBox > { * Controller.ACTIVE (active) * @return */ - public CheckBox setImage( PImage theImage , int theState ) { - if ( theImage != null ) { + public CheckBox setImage( final PImage theImage , final int theState ) { + if ( theImage != null && !_myRadioToggles.isEmpty( ) ) synchronized ( _myRadioToggles ) { images[ theState ] = theImage; availableImages[ theState ] = true; - for ( int i = 0 ; i < _myRadioToggles.size( ) ; i++ ) { - _myRadioToggles.get( i ).setImage( theImage , theState ); - } + for ( final Toggle tog : _myRadioToggles ) tog.setImage( theImage , theState ); } return this; } @@ -331,41 +303,37 @@ public class CheckBox extends ControlGroup< CheckBox > { } public CheckBox setSize( int theWidth , int theHeight ) { - setItemWidth( theWidth ); - setItemHeight( theHeight ); - return this; + return setItemWidth( theWidth ).setItemHeight( theHeight ); } /** - * set the height of a radioButton/checkBox item. by default the height is 11px. in order to - * recognize a custom height, the itemHeight has to be set before adding items to a - * radioButton/checkBox. + * Sets the height of a radioButton/checkBox item. by default the height is 11px. + * In order to recognize a custom height, the itemHeight has to be set + * before adding items to a radioButton/checkBox. * * @param theItemHeight */ - public CheckBox setItemHeight( int theItemHeight ) { + public CheckBox setItemHeight( final int theItemHeight ) { itemHeight = theItemHeight; - for ( Toggle t : _myRadioToggles ) { - t.setHeight( theItemHeight ); + if ( !_myRadioToggles.isEmpty( ) ) synchronized ( _myRadioToggles ) { + for ( final Toggle tog : _myRadioToggles ) tog.setHeight( theItemHeight ); } - updateLayout( ); - return this; + return updateLayout( ); } /** - * set the width of a radioButton/checkBox item. by default the width is 11px. in order to - * recognize a custom width, the itemWidth has to be set before adding items to a - * radioButton/checkBox. + * Sets the width of a radioButton/checkBox item. by default the width is 11px. + * In order to recognize a custom width, the itemWidth has to be set + * before adding items to a radioButton/checkBox. * * @param theItemWidth */ - public CheckBox setItemWidth( int theItemWidth ) { + public CheckBox setItemWidth( final int theItemWidth ) { itemWidth = theItemWidth; - for ( Toggle t : _myRadioToggles ) { - t.setWidth( theItemWidth ); + if ( !_myRadioToggles.isEmpty( ) ) synchronized ( _myRadioToggles ) { + for ( final Toggle tog : _myRadioToggles ) tog.setWidth( theItemWidth ); } - updateLayout( ); - return this; + return updateLayout( ); } /** @@ -389,10 +357,8 @@ public class CheckBox extends ControlGroup< CheckBox > { * @return boolean */ public boolean getState( int theIndex ) { - if ( theIndex < _myRadioToggles.size( ) && theIndex >= 0 ) { - return ( ( Toggle ) _myRadioToggles.get( theIndex ) ).getState( ); - } - return false; + return ( theIndex = Math.abs( theIndex ) ) < _myRadioToggles.size( ) ? + _myRadioToggles.get( theIndex ).getState( ) : false; } /** @@ -401,13 +367,10 @@ public class CheckBox extends ControlGroup< CheckBox > { * @param theName * @return */ - public boolean getState( String theName ) { - int n = _myRadioToggles.size( ); - for ( int i = 0 ; i < n ; i++ ) { - Toggle t = _myRadioToggles.get( i ); - if ( theName.equals( t.getName( ) ) ) { - return t.getState( ); - } + public boolean getState( final String theName ) { + if ( theName != null && !_myRadioToggles.isEmpty( ) ) synchronized ( _myRadioToggles ) { + for ( final Toggle tog : _myRadioToggles ) + if ( theName.equals( tog.getName( ) ) ) return tog.getState( ); } return false; } @@ -415,38 +378,31 @@ public class CheckBox extends ControlGroup< CheckBox > { /** * @exclude */ - public void updateLayout( ) { - int nn = 0; - int xx = 0; - int yy = 0; - int n = _myRadioToggles.size( ); - for ( int i = 0 ; i < n ; i++ ) { - Toggle t = _myRadioToggles.get( i ); - set( t.position , xx , yy ); - - xx += t.getWidth( ) + spacingColumn; - nn++; - if ( nn == itemsPerRow ) { - nn = 0; - _myWidth = xx; - yy += t.getHeight( ) + spacingRow; - xx = 0; - } else { - _myWidth = xx; + public CheckBox updateLayout( ) { + if ( !_myRadioToggles.isEmpty( ) ) synchronized ( _myRadioToggles ) { + int nn = 0 , xx = 0 , yy = 0; + for ( final Toggle tog : _myRadioToggles ) { + set( tog.position , xx , yy ); + _myWidth = xx += tog.getWidth( ) + spacingColumn; + if ( ++nn == itemsPerRow ) { + xx = nn = 0; + yy += tog.getHeight( ) + spacingRow; + } } } + return this; } /** - * Items of a radioButton or a checkBox are organized in columns and rows. SetItemsPerRow sets - * the limit of items per row. items exceeding the limit will be pushed to the next row. + * Items of a RadioButton or a CheckBox are organized in columns and rows. + * setItemsPerRow() sets the limit of items per row. + * Items exceeding the limit will be pushed to the next row. * * @param theValue */ public CheckBox setItemsPerRow( final int theValue ) { itemsPerRow = theValue; - updateLayout( ); - return this; + return updateLayout( ); } /** @@ -454,10 +410,9 @@ public class CheckBox extends ControlGroup< CheckBox > { * * @param theSpacing */ - public CheckBox setSpacingColumn( final int theSpacing ) { - spacingColumn = theSpacing; - updateLayout( ); - return this; + public CheckBox setSpacingColumn( final int theSpacingCol ) { + spacingColumn = theSpacingCol; + return updateLayout( ); } /** @@ -465,23 +420,18 @@ public class CheckBox extends ControlGroup< CheckBox > { * * @param theSpacing */ - public CheckBox setSpacingRow( final int theSpacing ) { - spacingRow = theSpacing; - updateLayout( ); - return this; + public CheckBox setSpacingRow( final int theSpacingRow ) { + spacingRow = theSpacingRow; + return updateLayout( ); } public CheckBox deactivateAll( ) { - if ( !isMultipleChoice && !noneSelectedAllowed ) { - return this; - } - int n = _myRadioToggles.size( ); - for ( int i = 0 ; i < n ; i++ ) { - ( ( Toggle ) _myRadioToggles.get( i ) ).deactivate( ); + if ( !isMultipleChoice & !noneSelectedAllowed || _myRadioToggles.isEmpty( ) ) return this; + synchronized ( _myRadioToggles ) { + for ( final Toggle tog : _myRadioToggles ) tog.deactivate( ); } _myValue = -1; - updateValues( true ); - return this; + return updateValues( true ); } /** @@ -489,85 +439,45 @@ public class CheckBox extends ControlGroup< CheckBox > { * * @exclude */ - @ControlP5.Invisible @Override public void controlEvent( ControlEvent theEvent ) { - + @ControlP5.Invisible @Override public void controlEvent( final ControlEvent theEvent ) { if ( !isMultipleChoice ) { - if ( noneSelectedAllowed == false && theEvent.getController( ).getValue( ) < 1 ) { - if ( theEvent.getController( ) instanceof Toggle ) { - Toggle t = ( ( Toggle ) theEvent.getController( ) ); - boolean b = t.isBroadcast( ); - t.setBroadcast( false ); - t.setState( true ); - t.setBroadcast( b ); - return; - } + final Controller< ? > ctrl = theEvent.getController( ); + if ( !noneSelectedAllowed && ctrl.getValue( ) < 1 && ctrl instanceof Toggle ) { + final Toggle tog = ( Toggle ) ctrl; + final boolean b = tog.isBroadcast( ); + tog.setBroadcast( false ).setState( true ).setBroadcast( b ); + return; } - _myValue = -1; - int n = _myRadioToggles.size( ); - for ( int i = 0 ; i < n ; i++ ) { - Toggle t = _myRadioToggles.get( i ); - if ( !t.equals( theEvent.getController( ) ) ) { - t.deactivate( ); - } else { - if ( t.isOn ) { - _myValue = t.internalValue( ); - } - } + if ( !_myRadioToggles.isEmpty( ) ) synchronized ( _myRadioToggles ) { + _myValue = -1; + for ( final Toggle tog : _myRadioToggles ) + if ( !tog.equals( ctrl ) ) tog.deactivate( ); + else if ( tog.isOn( ) ) _myValue = t.internalValue( ); } } updateValues( true ); - if ( _myPlug != null ) { - try { - Method method = _myPlug.getClass( ).getMethod( _myPlugName , float[].class ); - method.invoke( _myPlug , ( float[] ) getArrayValue( ) ); - } catch ( SecurityException ex ) { - ex.printStackTrace( ); - } catch ( NoSuchMethodException ex ) { - ex.printStackTrace( ); - } catch ( IllegalArgumentException ex ) { - ex.printStackTrace( ); - } catch ( IllegalAccessException ex ) { - ex.printStackTrace( ); - } catch ( InvocationTargetException ex ) { - ex.printStackTrace( ); - } + if ( _myPlug != null ) try { + final Method method = _myPlug.getClass( ).getMethod( _myPlugName , float[].class ); + method.invoke( _myPlug , getArrayValue( ) ); + } catch ( SecurityException | IllegalArgumentException | ReflectiveOperationException ex ) { + ex.printStackTrace( ); } - } - public CheckBox plugTo( Object theObject ) { - _myPlug = theObject; - if ( !ControllerPlug.checkPlug( _myPlug , _myPlugName , new Class[] { float[].class } ) ) { - _myPlug = null; - } + public CheckBox plugTo( final Object theObject ) { + _myPlug = ControllerPlug.checkPlug( theObject , _myPlugName , new Class[] { float[].class } ) + ? theObject : null; return this; } - public CheckBox plugTo( Object theObject , String thePlugName ) { - _myPlug = theObject; + public CheckBox plugTo( final Object theObject , final String thePlugName ) { _myPlugName = thePlugName; - if ( !ControllerPlug.checkPlug( _myPlug , _myPlugName , new Class[] { float[].class } ) ) { - _myPlug = null; - } - return this; - } - - protected void updateValues( boolean theBroadcastFlag ) { - int n = _myRadioToggles.size( ); - _myArrayValue = new float[ n ]; - for ( int i = 0 ; i < n ; i++ ) { - Toggle t = ( ( Toggle ) _myRadioToggles.get( i ) ); - _myArrayValue[ i ] = t.getValue( ); - } - if ( theBroadcastFlag ) { - ControlEvent myEvent = new ControlEvent( this ); - cp5.getControlBroadcaster( ).broadcast( myEvent , ControlP5Constants.FLOAT ); - } + return plugTo( theObject ); } /** - * In order to always have 1 item selected, use setNoneSelectedAllowed(false), by default this - * is true. setNoneSelectedAllowed does not apply when in multipleChoice mode. + * In order to always have 1 item selected, use setNoneSelectedAllowed(false). + * By default this is true. setNoneSelectedAllowed() does not apply when in multipleChoice mode. * * @param theValue */ @@ -576,30 +486,30 @@ public class CheckBox extends ControlGroup< CheckBox > { return this; } - public CheckBox setColorLabels( int theColor ) { - for ( Toggle t : _myRadioToggles ) { - t.getCaptionLabel( ).setColor( theColor ); + public CheckBox setColorLabels( final int theColor ) { + if ( !_myRadioToggles.isEmpty( ) ) synchronized ( _myRadioToggles ) { + for ( final Toggle tog : _myRadioToggles ) tog.getCaptionLabel( ).setColor( theColor ); } return this; } public CheckBox hideLabels( ) { - for ( Toggle t : _myRadioToggles ) { - t.getCaptionLabel( ).setVisible( false ); + if ( !_myRadioToggles.isEmpty( ) ) synchronized ( _myRadioToggles ) { + for ( final Toggle tog : _myRadioToggles ) tog.getCaptionLabel( ).setVisible( false ); } return this; } public CheckBox showLabels( ) { - for ( Toggle t : _myRadioToggles ) { - t.getCaptionLabel( ).setVisible( true ); + if ( !_myRadioToggles.isEmpty( ) ) synchronized ( _myRadioToggles ) { + for ( final Toggle tog : _myRadioToggles ) tog.getCaptionLabel( ).setVisible( true ); } return this; } public CheckBox toUpperCase( boolean theValue ) { - for ( Toggle t : _myRadioToggles ) { - t.getCaptionLabel( ).toUpperCase( theValue ); + if ( !_myRadioToggles.isEmpty( ) ) synchronized ( _myRadioToggles ) { + for ( final Toggle tog : _myRadioToggles ) tog.getCaptionLabel( ).toUpperCase( theValue ); } return this; }