A layout manager that lays out components along a circle : Layout « Swing JFC « Java






A layout manager that lays out components along a circle

A layout manager that lays out components along a circle
  
/*
   This program is a part of the companion code for Core Java 8th ed.
   (http://horstmann.com/corejava)

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Insets;
import java.awt.LayoutManager;

import javax.swing.JButton;
import javax.swing.JFrame;

/**
 * @version 1.32 2007-06-12
 * @author Cay Horstmann
 */
public class CircleLayoutTest
{
   public static void main(String[] args)
   {
      EventQueue.invokeLater(new Runnable()
         {
            public void run()
            {
               CircleLayoutFrame frame = new CircleLayoutFrame();
               frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
               frame.setVisible(true);
            }
         });
   }
}

/**
 * A frame that shows buttons arranged along a circle.
 */
class CircleLayoutFrame extends JFrame
{
   public CircleLayoutFrame()
   {
      setTitle("CircleLayoutTest");

      setLayout(new CircleLayout());
      add(new JButton("Yellow"));
      add(new JButton("Blue"));
      add(new JButton("Red"));
      add(new JButton("Green"));
      add(new JButton("Orange"));
      add(new JButton("Fuchsia"));
      add(new JButton("Indigo"));
      pack();
   }
}

/**
 * A layout manager that lays out components along a circle.
 */
class CircleLayout implements LayoutManager
{
   public void addLayoutComponent(String name, Component comp)
   {
   }

   public void removeLayoutComponent(Component comp)
   {
   }

   public void setSizes(Container parent)
   {
      if (sizesSet) return;
      int n = parent.getComponentCount();

      preferredWidth = 0;
      preferredHeight = 0;
      minWidth = 0;
      minHeight = 0;
      maxComponentWidth = 0;
      maxComponentHeight = 0;

      // compute the maximum component widths and heights
      // and set the preferred size to the sum of the component sizes.
      for (int i = 0; i < n; i++)
      {
         Component c = parent.getComponent(i);
         if (c.isVisible())
         {
            Dimension d = c.getPreferredSize();
            maxComponentWidth = Math.max(maxComponentWidth, d.width);
            maxComponentHeight = Math.max(maxComponentHeight, d.height);
            preferredWidth += d.width;
            preferredHeight += d.height;
         }
      }
      minWidth = preferredWidth / 2;
      minHeight = preferredHeight / 2;
      sizesSet = true;
   }

   public Dimension preferredLayoutSize(Container parent)
   {
      setSizes(parent);
      Insets insets = parent.getInsets();
      int width = preferredWidth + insets.left + insets.right;
      int height = preferredHeight + insets.top + insets.bottom;
      return new Dimension(width, height);
   }

   public Dimension minimumLayoutSize(Container parent)
   {
      setSizes(parent);
      Insets insets = parent.getInsets();
      int width = minWidth + insets.left + insets.right;
      int height = minHeight + insets.top + insets.bottom;
      return new Dimension(width, height);
   }

   public void layoutContainer(Container parent)
   {
      setSizes(parent);

      // compute center of the circle

      Insets insets = parent.getInsets();
      int containerWidth = parent.getSize().width - insets.left - insets.right;
      int containerHeight = parent.getSize().height - insets.top - insets.bottom;

      int xcenter = insets.left + containerWidth / 2;
      int ycenter = insets.top + containerHeight / 2;

      // compute radius of the circle

      int xradius = (containerWidth - maxComponentWidth) / 2;
      int yradius = (containerHeight - maxComponentHeight) / 2;
      int radius = Math.min(xradius, yradius);

      // lay out components along the circle

      int n = parent.getComponentCount();
      for (int i = 0; i < n; i++)
      {
         Component c = parent.getComponent(i);
         if (c.isVisible())
         {
            double angle = 2 * Math.PI * i / n;

            // center point of component
            int x = xcenter + (int) (Math.cos(angle) * radius);
            int y = ycenter + (int) (Math.sin(angle) * radius);

            // move component so that its center is (x, y)
            // and its size is its preferred size
            Dimension d = c.getPreferredSize();
            c.setBounds(x - d.width / 2, y - d.height / 2, d.width, d.height);
         }
      }
   }

   private int minWidth = 0;
   private int minHeight = 0;
   private int preferredWidth = 0;
   private int preferredHeight = 0;
   private boolean sizesSet = false;
   private int maxComponentWidth = 0;
   private int maxComponentHeight = 0;
}

   
    
  








Related examples in the same category

1.Laying Out Components in a Flow (Left-to-Right, Top-to-Bottom)
2.Use FlowLayout to hold checkBox, Label and TextField
3.Vertical and horizontal BoxLayoutsVertical and horizontal BoxLayouts
4.Box Layout: Adding struts.Box Layout: Adding struts.
5.Using GlueUsing Glue
6.Rigid areas are like pairs of strutsRigid areas are like pairs of struts
7.Demonstrates BorderLayoutDemonstrates BorderLayout
8.Demonstrates GridLayoutDemonstrates GridLayout
9.Demonstrates FlowLayoutDemonstrates FlowLayout
10.A test of the BoxLayout manager using the Box utility classA test of the BoxLayout manager using the Box utility class
11.A test of the box layout manager using the Box utility class 2A test of the box layout manager using the Box utility class 2
12.A test of the OverlayLayout manager allowing experimentationA test of the OverlayLayout manager allowing experimentation
13.Box layout manager using the Box utility classBox layout manager using the Box utility class
14.BoxLayout demo 1BoxLayout demo 1
15.A demonstration of the SpringLayout class
16.A test of the BoxLayout manager using the Box utility class 3A test of the BoxLayout manager using the Box utility class 3
17.BoxLayout AlignmentBoxLayout Alignment
18.BoxLayout alignment 2BoxLayout alignment 2
19.BoxLayout Component alignmentBoxLayout Component alignment
20.BoxLayout X Y alignmentBoxLayout X Y alignment
21.BoxLayout: Glue SampleBoxLayout: Glue Sample
22.Layout: Overlay SampleLayout: Overlay Sample
23.BoxLayout: setAlignmentX setAlignmentYBoxLayout: setAlignmentX setAlignmentY
24.Component AlignmentComponent Alignment
25.GridLayout Demo 3GridLayout Demo 3
26.BoxLayout SampleBoxLayout Sample
27.BoxLayout Demo 3BoxLayout Demo 3
28.Various layoutsVarious layouts
29.BoxLayout Demo 4BoxLayout Demo 4
30.GridLayout DemoGridLayout Demo
31.CardLayout DemoCardLayout Demo
32.Using CardLayout
33.Laying Out a Screen with CardLayoutLaying Out a Screen with CardLayout
34.Laying out a screen with SpringLayoutLaying out a screen with SpringLayout
35.BorderLayout PaneBorderLayout Pane
36.Add buttons to all parts of a BorderLayout
37.A BorderLayout divides the space into five regions: North, West, South, East and Centre.
38.A typical usage of a border layout manager.
39.BoxLayout PaneBoxLayout Pane
40.FlowLayout PaneFlowLayout Pane
41.GridLayout PaneGridLayout Pane
42.Laying Out Components in a Grid
43.NullLayout PaneNullLayout Pane
44.Without layout manager, we position components using absolute values.
45.Simpler CardLayout demo
46.Use SpringLayout to create a single row of componentsUse SpringLayout to create a single row of components
47. Spring Demo 1 Spring Demo 1
48.Spring Demo 2Spring Demo 2
49.Spring Demo 3Spring Demo 3
50.Spring Demo 4Spring Demo 4
51.Spring Compact GridSpring Compact Grid
52.Spring Form Spring Form
53.SpringLayout Utilities
54.Absolute Layout DemoAbsolute Layout Demo
55.A horizontal layout layout manager that allocates horizontal space in specified proportions
56.Laying Out Components Using Absolute Coordinates
57.A vertical layout manager similar to java.awt.FlowLayout
58.A JTextField for displaying insets.
59.A frame that uses a group layout to arrange font selection components
60.Utility methods for creating form- or grid-style layouts with SpringLayout.
61.A vertical flow layout is similar to a flow layuot but it layouts the components vertically instead of horizontally.