Mega Code Archive

 
Categories / Java / Swing JFC
 

Custom Layout Demo

/* From http://java.sun.com/docs/books/tutorial/index.html */ /*  * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.  *  * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions are met:  *  * -Redistribution of source code must retain the above copyright notice, this  *  list of conditions and the following disclaimer.  *  * -Redistribution in binary form must reproduce the above copyright notice,  *  this list of conditions and the following disclaimer in the documentation  *  and/or other materials provided with the distribution.  *  * Neither the name of Sun Microsystems, Inc. or the names of contributors may  * be used to endorse or promote products derived from this software without  * specific prior written permission.  *  * This software is provided "AS IS," without a warranty of any kind. ALL  * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING  * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE  * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN")  * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE  * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS  * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST  * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,  * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY  * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,  * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.  *  * You acknowledge that this software is not designed, licensed or intended  * for use in the design, construction, operation or maintenance of any  * nuclear facility.  */ /*  * CustomLayoutDemo.java is a 1.4 application that requires one other file:  * DiagonalLayout.java  */ import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Insets; import java.awt.LayoutManager; import javax.swing.JButton; import javax.swing.JFrame; public class CustomLayoutDemo {   public static void addComponentsToPane(Container pane) {     pane.setLayout(new DiagonalLayout());     pane.add(new JButton("Button 1"));     pane.add(new JButton("Button 2"));     pane.add(new JButton("Button 3"));     pane.add(new JButton("Button 4"));     pane.add(new JButton("Button 5"));   }   /**    * Create the GUI and show it. For thread safety, this method should be    * invoked from the event-dispatching thread.    */   private static void createAndShowGUI() {     //Make sure we have nice window decorations.     JFrame.setDefaultLookAndFeelDecorated(true);     //Create and set up the window.     JFrame frame = new JFrame("CustomLayoutDemo");     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     //Set up the content pane.     addComponentsToPane(frame.getContentPane());     //Display the window.     frame.pack();     frame.setVisible(true);   }   public static void main(String[] args) {     //Schedule a job for the event-dispatching thread:     //creating and showing this application's GUI.     javax.swing.SwingUtilities.invokeLater(new Runnable() {       public void run() {         createAndShowGUI();       }     });   } } /*  * 1.2+ version. Used by CustomLayoutDemo.java.  */ class DiagonalLayout implements LayoutManager {   private int vgap;   private int minWidth = 0, minHeight = 0;   private int preferredWidth = 0, preferredHeight = 0;   private boolean sizeUnknown = true;   public DiagonalLayout() {     this(5);   }   public DiagonalLayout(int v) {     vgap = v;   }   /* Required by LayoutManager. */   public void addLayoutComponent(String name, Component comp) {   }   /* Required by LayoutManager. */   public void removeLayoutComponent(Component comp) {   }   private void setSizes(Container parent) {     int nComps = parent.getComponentCount();     Dimension d = null;     //Reset preferred/minimum width and height.     preferredWidth = 0;     preferredHeight = 0;     minWidth = 0;     minHeight = 0;     for (int i = 0; i < nComps; i++) {       Component c = parent.getComponent(i);       if (c.isVisible()) {         d = c.getPreferredSize();         if (i > 0) {           preferredWidth += d.width / 2;           preferredHeight += vgap;         } else {           preferredWidth = d.width;         }         preferredHeight += d.height;         minWidth = Math.max(c.getMinimumSize().width, minWidth);         minHeight = preferredHeight;       }     }   }   /* Required by LayoutManager. */   public Dimension preferredLayoutSize(Container parent) {     Dimension dim = new Dimension(0, 0);     int nComps = parent.getComponentCount();     setSizes(parent);     //Always add the container's insets!     Insets insets = parent.getInsets();     dim.width = preferredWidth + insets.left + insets.right;     dim.height = preferredHeight + insets.top + insets.bottom;     sizeUnknown = false;     return dim;   }   /* Required by LayoutManager. */   public Dimension minimumLayoutSize(Container parent) {     Dimension dim = new Dimension(0, 0);     int nComps = parent.getComponentCount();     //Always add the container's insets!     Insets insets = parent.getInsets();     dim.width = minWidth + insets.left + insets.right;     dim.height = minHeight + insets.top + insets.bottom;     sizeUnknown = false;     return dim;   }   /* Required by LayoutManager. */   /*    * This is called when the panel is first displayed, and every time its size    * changes. Note: You CAN'T assume preferredLayoutSize or minimumLayoutSize    * will be called -- in the case of applets, at least, they probably won't    * be.    */   public void layoutContainer(Container parent) {     Insets insets = parent.getInsets();     int maxWidth = parent.getWidth() - (insets.left + insets.right);     int maxHeight = parent.getHeight() - (insets.top + insets.bottom);     int nComps = parent.getComponentCount();     int previousWidth = 0, previousHeight = 0;     int x = 0, y = insets.top;     int rowh = 0, start = 0;     int xFudge = 0, yFudge = 0;     boolean oneColumn = false;     // Go through the components' sizes, if neither     // preferredLayoutSize nor minimumLayoutSize has     // been called.     if (sizeUnknown) {       setSizes(parent);     }     if (maxWidth <= minWidth) {       oneColumn = true;     }     if (maxWidth != preferredWidth) {       xFudge = (maxWidth - preferredWidth) / (nComps - 1);     }     if (maxHeight > preferredHeight) {       yFudge = (maxHeight - preferredHeight) / (nComps - 1);     }     for (int i = 0; i < nComps; i++) {       Component c = parent.getComponent(i);       if (c.isVisible()) {         Dimension d = c.getPreferredSize();         // increase x and y, if appropriate         if (i > 0) {           if (!oneColumn) {             x += previousWidth / 2 + xFudge;           }           y += previousHeight + vgap + yFudge;         }         // If x is too large,         if ((!oneColumn)             && (x + d.width) > (parent.getWidth() - insets.right)) {           // reduce x to a reasonable number.           x = parent.getWidth() - insets.bottom - d.width;         }         // If y is too large,         if ((y + d.height) > (parent.getHeight() - insets.bottom)) {           // do nothing.           // Another choice would be to do what we do to x.         }         // Set the component's size and position.         c.setBounds(x, y, d.width, d.height);         previousWidth = d.width;         previousHeight = d.height;       }     }   }   public String toString() {     String str = "";     return getClass().getName() + "[vgap=" + vgap + str + "]";   } }