Solution
Download RatioLayout source code.
HTML Interface to Applet
<APPLET CODEBASE="/applets/magelang/AWT-Training/classes/" CODE="RatioLayout.class" WIDTH= HEIGHT= ALIGN=CENTER></APPLET>
Java Code
import java.awt.*;
import java.util.Vector;
import java.util.StringTokenizer;
/* RatioLayout.java -- Layout manager for Java containers
*
* This layout manager allows you to specify ratios of x,y,width,height
* characteristics of the components. For example,
*
* setLayout(new RatioLayout());
* add("0,0;.45,.5", new Button("OK")); // upper left corner, 45% x 50%
* add(".75,.75", new Button("QUIT")); // 75%,75% and use preferred size
*
* You may also specify position coordinates as "c", implying "center".
*
* add("c,.2", new Button("OK")); // center across, 20% down
*
* Terence Parr
* MageLang Institute, www.MageLang.com
*/
public class RatioLayout implements LayoutManager {
// track the ratios for each object of form "xratio,yratio;wratio,hratio"
Vector ratios = new Vector(10);
// track the components also so we can remove associated modifier
// if necessary.
Vector components = new Vector(10);
public void addLayoutComponent(String r, Component comp) {
ratios.addElement(r);
components.addElement(comp);
}
public void removeLayoutComponent(Component comp) {
int i = components.indexOf(comp);
if ( i!=-1 ) {
ratios.removeElementAt(i);
components.removeElementAt(i);
}
}
public Dimension preferredLayoutSize(Container target) {
return target.size();
}
public Dimension minimumLayoutSize(Container target) {
return target.size();
}
public void layoutContainer(Container target) {
Insets insets = target.insets();
int ncomponents = target.countComponents();
Dimension d = target.size();
d.width -= insets.left+insets.right;
d.height -= insets.top+insets.bottom;
for (int i = 0 ; i < ncomponents ; i++) {
Component comp = target.getComponent(i);
Dimension compDim = comp.preferredSize();
StringTokenizer st =
new StringTokenizer((String)ratios.elementAt(i), ", \t;");
float rx,ry;
String sx = st.nextToken();
String sy = st.nextToken();
// Compute ratios for x,y.
// If a coordinate is "c" then center the component.
if ( sx.equalsIgnoreCase("c") ) {
// compute: what is ratio position for left-edge
// of component when centered?
double px = (d.width/2.0) - (compDim.width/2.0);
rx = (float)px/d.width; // convert to ratio
}
else {
rx = Float.valueOf(sx).floatValue();
}
if ( sy.equalsIgnoreCase("c") ) {
double py = (d.height/2.0) - (compDim.height/2.0);
ry = (float)py/d.height; // convert to ratio
}
else {
ry = Float.valueOf(sy).floatValue();
}
float rw=0;
float rh=0;
int w,h;
if ( st.hasMoreElements() ) {// get width, height if they exist
rw = Float.valueOf(st.nextToken()).floatValue();
rh = Float.valueOf(st.nextToken()).floatValue();
w = (int)(d.width*rw);
h = (int)(d.height*rh);
}
else {
w = compDim.width;
h = compDim.height;
}
int x = (int)(d.width*rx);
int y = (int)(d.height*ry);
comp.reshape(x+insets.left,y+insets.top,w,h);
}
}
public String toString() {
return getClass().getName();
}
}
|