Mega Code Archive

 
Categories / Java / Swing JFC
 

ColumnLayout

/*  * Copyright (c) 2000 David Flanagan.  All rights reserved.  * This code is from the book Java Examples in a Nutshell, 2nd Edition.  * It is provided AS-IS, WITHOUT ANY WARRANTY either expressed or implied.  * You may study, use, and modify it for any non-commercial purpose.  * You may distribute it non-commercially as long as you retain this notice.  * For a commercial use license, or to purchase the book (recommended),  * visit http://www.davidflanagan.com/javaexamples2.  */ import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Font; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.Insets; import java.awt.LayoutManager2; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; /**  * This LayoutManager arranges the components into a column. Components are  * always given their preferred size.  *   * When you create a ColumnLayout, you may specify four values: margin_height --  * how much space to leave on top and bottom margin_width -- how much space to  * leave on left and right spacing -- how much vertical space to leave between  * items alignment -- the horizontal position of the components:  * ColumnLayout.LEFT -- left-justify the components ColumnLayout.CENTER --  * horizontally center the components ColumnLayout.RIGHT -- right-justify the  * components  *   * You never call the methods of a ColumnLayout object. Just create one and make  * it the layout manager for your container by passing it to the addLayout()  * method of the Container object.  */ public class ColumnLayout implements LayoutManager2 {   protected int margin_height;   protected int margin_width;   protected int spacing;   protected int alignment;   // Constants for the alignment argument to the constructor.   public static final int LEFT = 0;   public static final int CENTER = 1;   public static final int RIGHT = 2;   /** The constructor. See comment above for meanings of these arguments */   public ColumnLayout(int margin_height, int margin_width, int spacing,       int alignment) {     this.margin_height = margin_height;     this.margin_width = margin_width;     this.spacing = spacing;     this.alignment = alignment;   }   /**    * A default constructor that creates a ColumnLayout using 5-pixel margin    * width and height, 5-pixel spacing, and left alignment    */   public ColumnLayout() {     this(5, 5, 5, LEFT);   }   /**    * The method that actually performs the layout. Called by the Container    */   public void layoutContainer(Container parent) {     Insets insets = parent.getInsets();     Dimension parent_size = parent.getSize();     Component kid;     int nkids = parent.getComponentCount();     int x0 = insets.left + margin_width; // The base X position     int x;     int y = insets.top + margin_height; // Start at the top of the column     for (int i = 0; i < nkids; i++) { // Loop through the kids       kid = parent.getComponent(i); // Get the kid       if (!kid.isVisible())         continue; // Skip hidden ones       Dimension pref = kid.getPreferredSize(); // How big is it?       switch (alignment) { // Compute X coordinate       default:       case LEFT:         x = x0;         break;       case CENTER:         x = (parent_size.width - pref.width) / 2;         break;       case RIGHT:         x = parent_size.width - insets.right - margin_width             - pref.width;         break;       }       // Set the size and position of this kid       kid.setBounds(x, y, pref.width, pref.height);       y += pref.height + spacing; // Get Y position of the next one     }   }   /** The Container calls this to find out how big the layout should to be */   public Dimension preferredLayoutSize(Container parent) {     return layoutSize(parent, 1);   }   /** The Container calls this to find out how big the layout must be */   public Dimension minimumLayoutSize(Container parent) {     return layoutSize(parent, 2);   }   /** The Container calls this to find out how big the layout can be */   public Dimension maximumLayoutSize(Container parent) {     return layoutSize(parent, 3);   }   // Compute min, max, or preferred size of all the visible children   protected Dimension layoutSize(Container parent, int sizetype) {     int nkids = parent.getComponentCount();     Dimension size = new Dimension(0, 0);     Insets insets = parent.getInsets();     int num_visible_kids = 0;     // Compute maximum width and total height of all visible kids     for (int i = 0; i < nkids; i++) {       Component kid = parent.getComponent(i);       Dimension d;       if (!kid.isVisible())         continue;       num_visible_kids++;       if (sizetype == 1)         d = kid.getPreferredSize();       else if (sizetype == 2)         d = kid.getMinimumSize();       else         d = kid.getMaximumSize();       if (d.width > size.width)         size.width = d.width;       size.height += d.height;     }     // Now add in margins and stuff     size.width += insets.left + insets.right + 2 * margin_width;     size.height += insets.top + insets.bottom + 2 * margin_height;     if (num_visible_kids > 1)       size.height += (num_visible_kids - 1) * spacing;     return size;   }   // Other LayoutManager(2) methods that are unused by this class   public void addLayoutComponent(String constraint, Component comp) {   }   public void addLayoutComponent(Component comp, Object constraint) {   }   public void removeLayoutComponent(Component comp) {   }   public void invalidateLayout(Container parent) {   }   public float getLayoutAlignmentX(Container parent) {     return 0.5f;   }   public float getLayoutAlignmentY(Container parent) {     return 0.5f;   } } class ColumnLayoutPane extends JPanel {   public ColumnLayoutPane() {     // Get rid of the default layout manager.     // We'll arrange the components ourselves.     this.setLayout(new ColumnLayout(5, 5, 10, ColumnLayout.RIGHT));     // Create some buttons and set their sizes and positions explicitly     for (int i = 0; i < 6; i++) {       int pointsize = 8 + i * 2;       JButton b = new JButton("Point size " + pointsize);       b.setFont(new Font("helvetica", Font.BOLD, pointsize));       this.add(b);     }   }   public static void main(String[] a) {     JFrame f = new JFrame();     f.addWindowListener(new WindowAdapter() {       public void windowClosing(WindowEvent e) {         System.exit(0);       }     });     f.setContentPane(new ColumnLayoutPane());     f.pack();     f.setVisible(true);   }    }