A horizontal layout layout manager that allocates horizontal space in specified proportions
package com.equitysoft.cellspark;
/**
THIS PROGRAM IS PROVIDED "AS IS" WITHOUT ANY WARRANTIES (OR CONDITIONS),
EXPRESS OR IMPLIED WITH RESPECT TO THE PROGRAM, INCLUDING THE IMPLIED WARRANTIES (OR CONDITIONS)
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK ARISING OUT OF USE OR
PERFORMANCE OF THE PROGRAM AND DOCUMENTATION REMAINS WITH THE USER.
*/
import java.awt.*; import java.util.*;
/**
*
* A horizontal layout layout manager that allocates horizontal space in specified proportions.
* The same can be done with GridBagLayout but GridBagLayout has a problem when space is resized
* particularly when moving a JSplitPane divider - the proportions will suddenly change
* for no apparent reason. ProportionalLayout solves the problem.
*
* Revision date 12th July 2001
*
* @author Colin Mummery e-mail: colin_mummery@yahoo.com Homepage:www.kagi.com/equitysoft
*/
public class ProportionalLayout implements LayoutManager{
private Hashtable comps;
private int[] proportions;
private int total; //The total of the proportions
private int num; //The number in the array
//Constructors
/**
* Constructs a ProportinalLayout instance with the specified horizontal component proportions
*
* @param proportions An int array of values indicating horizontal proportions. An array of 2,1,1 would
* give the first component added half the space horizontally, the second and the third would each get a quarter.
* More components would not be given any space at all. When there are less than the expected number of components
* the unused values in the proportions array will correspond to blank space in the layout.
*/
public ProportionalLayout(int[] proportions){
this.proportions=proportions;
num=proportions.length;
for(int i=0;i<num;i++){
int prop=proportions[i];
total+=prop;
}
}
//----------------------------------------------------------------------------
private Dimension layoutSize(Container parent,boolean minimum){
Dimension dim=new Dimension(0,0);
synchronized(parent.getTreeLock()){
int n=parent.getComponentCount();
int cnt=0;
for(int i=0;i<n;i++){
Component c=parent.getComponent(i); int maxhgt=0;
if(c.isVisible()){
Dimension d=(minimum)? c.getMinimumSize() : c.getPreferredSize();
dim.width+=d.width;
if(d.height>dim.height)dim.height=d.height;
}
cnt++; if(cnt==num)break;
}
}
Insets insets=parent.getInsets();
dim.width+=insets.left+insets.right;
dim.height+=insets.top+insets.bottom;
return dim;
}
//-----------------------------------------------------------------------------
/**
* Lays out the container.
*/
public void layoutContainer(Container parent){
Insets insets=parent.getInsets();
synchronized(parent.getTreeLock()){
int n=parent.getComponentCount();
Dimension pd=parent.getSize();
//do layout
int cnt=0;
int totalwid=pd.width-insets.left-insets.right;
int x=insets.left; int cumwid=0;
for(int i=0;i<n;i++){
Component c=parent.getComponent(i);
int wid=proportions[i]*totalwid/total;
c.setBounds(x,insets.top,wid,pd.height-insets.bottom-insets.top);
x+=wid;
cnt++; if(cnt==num)break;
}
}
}
//-----------------------------------------------------------------------------
public Dimension minimumLayoutSize(Container parent){return layoutSize(parent,false);}
//-----------------------------------------------------------------------------
public Dimension preferredLayoutSize(Container parent){return layoutSize(parent,false);}
//----------------------------------------------------------------------------
/**
* Not used by this class
*/
public void addLayoutComponent(String name,Component comp){}
//-----------------------------------------------------------------------------
/**
* Not used by this class
*/
public void removeLayoutComponent(Component comp){}
//-----------------------------------------------------------------------------
public String toString(){
StringBuffer sb=new StringBuffer();
sb.append(getClass().getName()).append('['); int len=proportions.length;
for(int i=0;i<len;i++){
sb.append('p').append(i).append('=').append(proportions[i]);
if(i!=len-1)sb.append(',');
}
sb.append(']');
return sb.toString();
}
//-----------------------------------------------------------------------------
}
Related examples in the same category