- Comparing to a GridBagLayout, the 3. and 4. parameter would be gridwith and gridheight.
Imagine a sheet of paper on which you draw your layout. You draw a set of boxes (box = Dockable) preferrable such that they do not overlap and such that there are no empty spaces between them. Each box has a position and a size. The position is the 1. and 2. parameter („x“ and „y“), the size is the 3. and 4. parameter (hence they are called „width“ and „height“).
This sheet is the „grid“, and magically the sheet is big enough that all your boxes always fit in. 
Afterwards someone has a close look to this sheet, finds out how to organize the Dockables, and „deploys“ them (the grid has no use afterwards).
-
As for the „list of dockables“: first of all, „add“ has a vararg-argument. You can just call something like:
grid.add( 1, 2, 3, 4, dockable1, dockable2, dockable3 );
… and second: if two Dockables have the exact some position and size, then they are also put together.
-
The difference between single- and multiple-Dockables is how they are handled when the framework stores the layout (the position, size and relations between all elements).
- Single-Dockable: just its identifier gets stored. The client is responsible for storing its content. Each single-Dockable has a unique identifier set by the client, no two dockables can share the same identifier.
- Multiple-Dockable: the client has to provide a factory which is used to store the content of the Dockable. There can be many dockables for each factory, they are not unique.
Apart from that, single- and multiple-Dockables are handled exactly the same way everywhere (unless the client application treats the differently). It has nothing todo with tabs.
Btw.: if I run your settings the Dockables clearly appear. The framework might not always guess correctly how to fill empty spaces and resolve overlappings, but no component gets hidden or forgotten.
public static void main( String[] args ){
JFrame frame = new JFrame( "Demo" );
CControl control = new CControl( frame );
frame.add( control.getContentArea(), BorderLayout.CENTER );
CGrid grid = new CGrid( control );
grid.add( 0, 0, 1, 1, createDockable( "Red", Color.RED ) );
grid.add( 0, 1, 1, 1, createDockable( "Green", Color.GREEN ) );
grid.add( 0, 2, 1, 1, createDockable( "Blue", Color.BLUE ) );
grid.add( 1, 0, 1, 1, createDockable( "Cyan", Color.CYAN ) );
grid.add( 2, 0, 1, 1, createDockable( "Magenta", Color.MAGENTA ) );
grid.add( 2, 1, 1, 1, createDockable( "Yellow", Color.YELLOW ) );
control.getContentArea().deploy( grid );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setBounds( 20, 20, 400, 400 );
frame.setVisible( true );
}
public static SingleCDockable createDockable( String title, Color color ){
JPanel panel = new JPanel();
panel.setOpaque( true );
panel.setBackground( color );
return new DefaultSingleCDockable( title, title, panel );
}
}```