package javaapplication1;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;/**
*
* @author xtass
*/
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 addLayoutComponents(String name,Component comp){
} public void removeLayoutComponents(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 maxium 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); //layout 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;
@Override
public void addLayoutComponent(String arg0, Component arg1) {
}
@Override
public void removeLayoutComponent(Component arg0) {
}
}