CircleLayoutDemo.java Source code

Java tutorial

Introduction

Here is the source code for CircleLayoutDemo.java

Source

/**
 * This layout manager allows you to place components to form a circle within a
 * Container
 * 
 * @author Oscar De Leon oedeleon@netscape.net
 * 
 */

import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class CircleLayoutDemo {

    public static void main(String a[]) {
        JFrame frame = new JFrame();
        JPanel circle = new JPanel();
        circle.setLayout(new CircleLayout(true));

        for (int i = 0; i < 10; i++) {
            circle.add(new JLabel("circle_" + i * 7));
        }
        frame.setContentPane(circle);
        frame.setSize(200, 400);

        frame.setVisible(true);
    }
}

/**
 * This layout manager allows you to place components to form a circle within a
 * Container
 * 
 * @author Oscar De Leon oedeleon@netscape.net
 * 
 */

class CircleLayout implements LayoutManager {

    ArrayList components;

    ArrayList names;

    private boolean isCircle;

    /**
     * Creates a new CircleLayout that lays out components in a perfect circle
     */

    public CircleLayout() {
        this(true);
    }

    /**
     * Creates a new CircleLayout that lays out components in either an Ellipse or
     * a Circle. Ellipse Layout is not yet implemented.
     * 
     * @param circle
     *          Indicated the shape to use. It's true for circle or false for
     *          ellipse.
     */
    public CircleLayout(boolean circle) {
        isCircle = circle;
    }

    /**
     * For compatibility with LayoutManager interface
     */
    public void addLayoutComponent(String name, Component comp) {
    }

    /**
     * Arranges the parent's Component objects in either an Ellipse or a Circle.
     * Ellipse is not yet implemented.
     */
    public void layoutContainer(Container parent) {
        int x, y, w, h, s, c;
        int n = parent.getComponentCount();
        double parentWidth = parent.getSize().width;
        double parentHeight = parent.getSize().height;
        Insets insets = parent.getInsets();
        int centerX = (int) (parentWidth - (insets.left + insets.right)) / 2;
        int centerY = (int) (parentHeight - (insets.top + insets.bottom)) / 2;

        Component comp = null;
        Dimension compPS = null;
        if (n == 1) {
            comp = parent.getComponent(0);
            x = centerX;
            y = centerY;
            compPS = comp.getPreferredSize();
            w = compPS.width;
            h = compPS.height;
            comp.setBounds(x, y, w, h);
        } else {
            double r = (Math.min(parentWidth - (insets.left + insets.right),
                    parentHeight - (insets.top + insets.bottom))) / 2;
            r *= 0.75; // Multiply by .75 to account for extreme right and bottom
                       // Components
            for (int i = 0; i < n; i++) {
                comp = parent.getComponent(i);
                compPS = comp.getPreferredSize();
                if (isCircle) {
                    c = (int) (r * Math.cos(2 * i * Math.PI / n));
                    s = (int) (r * Math.sin(2 * i * Math.PI / n));
                } else {
                    c = (int) ((centerX * 0.75) * Math.cos(2 * i * Math.PI / n));
                    s = (int) ((centerY * 0.75) * Math.sin(2 * i * Math.PI / n));
                }
                x = c + centerX;
                y = s + centerY;

                w = compPS.width;
                h = compPS.height;

                comp.setBounds(x, y, w, h);
            }
        }

    }

    /**
     * Returns this CircleLayout's preferred size based on its Container
     * 
     * @param target
     *          This CircleLayout's target container
     * @return The preferred size
     */

    public Dimension preferredLayoutSize(Container target) {
        return target.getSize();
    }

    /**
     * Returns this CircleLayout's minimum size based on its Container
     * 
     * @param target
     *          This CircleLayout's target container
     * @return The minimum size
     */
    public Dimension minimumLayoutSize(Container target) {
        return target.getSize();
    }

    /**
     * For compatibility with LayoutManager interface
     */
    public void removeLayoutComponent(Component comp) {
    }

    /**
     * Returns a String representation of this CircleLayout.
     * 
     * @return A String that represents this CircleLayout
     */
    public String toString() {
        return this.getClass().getName();
    }

}