Technical Support
Discussion Forum
Online Training
Read About Java
Java In-Depth
Product Discounts
Membership Information

Java Cup Logo

JDC Home Page


Working Applet
Help and Hints
Source Code
Table of Contents
Online Training
shadowSearchFAQFeedback

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();
    }
}