Java Tutorial/Swing/SwingUtilities

Материал из Java эксперт
Перейти к: навигация, поиск

14. Center that window on the given desktop.

   <source lang="java">

/*

* $Id: WindowUtils.java,v 1.16 2009/05/25 16:37:52 kschaefe Exp $
*
* Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.MouseInfo; import java.awt.Point; import java.awt.Rectangle; import javax.swing.JInternalFrame; /**

* Encapsulates various utilities for windows (ie: Frame and
* Dialog objects and descendants, in particular).
*
* @author Richard Bair
*/

public class Utils {

 /**
  * <p/>
  * Returns the Point at which a window should be placed to
  * center that window on the given desktop.
  * </p>
  * <p/>
  * Some thought was taken as to whether to implement a method such as this,
  * or to simply make a method that, given a window, will center it.  It was
  * decided that it is better to not alter an object within a method.
  * </p>
  *
  * @param window  The window (JInternalFrame) to calculate the center point
  *                for.  This object can not be null.
  *
  * @return the Point at which the window should be placed to
  *         center that window on the given desktop
  */
 public static Point getPointForCentering(JInternalFrame window) {
     try {
         //assert window != null;
         Point mousePoint = MouseInfo.getPointerInfo().getLocation();
         GraphicsDevice[] devices = GraphicsEnvironment
                 .getLocalGraphicsEnvironment().getScreenDevices();
         for (GraphicsDevice device : devices) {
             Rectangle bounds = device.getDefaultConfiguration().getBounds();
             //check to see if the mouse cursor is within these bounds
             if (mousePoint.x >= bounds.x && mousePoint.y >= bounds.y
                 && mousePoint.x <= (bounds.x + bounds.width)
                 && mousePoint.y <= (bounds.y + bounds.height)) {
                 //this is it
                 int screenWidth = bounds.width;
                 int screenHeight = bounds.height;
                 int width = window.getWidth();
                 int height = window.getHeight();
                 return new Point(((screenWidth - width) / 2) + bounds.x,
                                     ((screenHeight - height) / 2) + bounds
                                             .y);
             }
         }
     } catch (Exception e) {
        
     }
     return new Point(0, 0);
 }

}</source>





14. Change the sizes of all the passed buttons to be the size of the largest one.

   <source lang="java">

/*

* Copyright (C) 2001-2004 Colin Bell
* colbell@users.sourceforge.net
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

import java.awt.ruponent; import java.awt.Container; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Frame; import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.Insets; import java.awt.Point; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.Window; import java.awt.geom.Rectangle2D; import java.beans.PropertyVetoException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.SwingUtilities; /**

* Common GUI utilities accessed via static methods.
* 
* @author 
*/

public class GUIUtils {

 /**
  * Change the sizes of all the passed buttons to be the size of the largest
  * one.
  * 
  * @param btns
  *          Array of buttons to eb resized.
  * 
  * @throws IllegalArgumentException
  *           If btns is null.
  */
 public static void setJButtonSizesTheSame(JButton[] btns) {
   if (btns == null) {
     throw new IllegalArgumentException("null JButton[] passed");
   }
   // Get the largest width and height
   final Dimension maxSize = new Dimension(0, 0);
   for (int i = 0; i < btns.length; ++i) {
     final JButton btn = btns[i];
     final FontMetrics fm = btn.getFontMetrics(btn.getFont());
     Rectangle2D bounds = fm.getStringBounds(btn.getText(), btn.getGraphics());
     int boundsHeight = (int) bounds.getHeight();
     int boundsWidth = (int) bounds.getWidth();
     maxSize.width = boundsWidth > maxSize.width ? boundsWidth : maxSize.width;
     maxSize.height = boundsHeight > maxSize.height ? boundsHeight : maxSize.height;
   }
   Insets insets = btns[0].getInsets();
   maxSize.width += insets.left + insets.right;
   maxSize.height += insets.top + insets.bottom;
   for (int i = 0; i < btns.length; ++i) {
     JButton btn = btns[i];
     btn.setPreferredSize(maxSize);
   }
 }

}</source>





14. Convert a coordinate on a screen to a coordinate relative to a component"s bounds

   <source lang="java">

import java.awt.Point; import javax.swing.JButton; import javax.swing.SwingUtilities; public class Main {

 public static void main(String[] argv) {
   JButton component = new JButton();
   Point pt = new Point(component.getLocation());
   SwingUtilities.convertPointFromScreen(pt, component);
 }

}</source>





14. Convert a coordinate relative to a component"s bounds to screen coordinates

   <source lang="java">

import java.awt.Point; import javax.swing.JButton; import javax.swing.SwingUtilities; public class Main {

 public static void main(String[] argv) {
   JButton component = new JButton();
   Point pt = new Point(component.getLocation());
   SwingUtilities.convertPointToScreen(pt, component);
 }

}</source>





14. Get All Components in a container

   <source lang="java">

/*

* $Id: WindowUtils.java,v 1.16 2009/05/25 16:37:52 kschaefe Exp $
*
* Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

import java.awt.ruponent; import java.awt.Container; import java.util.ArrayList; import java.util.List; /**

* Encapsulates various utilities for windows (ie: Frame and
* Dialog objects and descendants, in particular).
*
* @author Richard Bair
*/

public class Utils {

 public static List<Component> getAllComponents(final Container c) {
   Component[] comps = c.getComponents();
   List<Component> compList = new ArrayList<Component>();
   for (Component comp : comps) {
     compList.add(comp);
     if (comp instanceof Container) {
       compList.addAll(getAllComponents((Container) comp));
     }
   }
   return compList;
 }

}</source>





14. Get Point For Centering

   <source lang="java">

/*

* $Id: WindowUtils.java,v 1.16 2009/05/25 16:37:52 kschaefe Exp $
*
* Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

import java.awt.GraphicsConfiguration; import java.awt.GraphicsEnvironment; import java.awt.Insets; import java.awt.Point; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.Window; /**

* Encapsulates various utilities for windows (ie: Frame and
* Dialog objects and descendants, in particular).
*
* @author Richard Bair
*/

public class Utils {

 public static Point getPointForCentering(Window window) {
   Rectangle usableBounds = getUsableDeviceBounds(window);
   int screenWidth = usableBounds.width;
   int screenHeight = usableBounds.height;
   int width = window.getWidth();
   int height = window.getHeight();
   
   return new Point(((screenWidth - width) / 2) + usableBounds.x,
           ((screenHeight - height) / 2) + usableBounds.y);

}

 /**
*

* Returns the Point at which a window should be placed to * center that window on the screen. *

*

* Some thought was taken as to whether to implement a method such as this, * or to simply make a method that, given a window, will center it. It was * decided that it is better to not alter an object within a method. *

  *
  * @param window The window to calculate the center point for.  This object
  *               can not be null.
  *
  * @return the Point at which the window should be placed to
  *         center that window on the screen.
  */
 private static Rectangle getUsableDeviceBounds(Window window) {
     Window owner = window.getOwner();
     GraphicsConfiguration gc = null;
     
     if (owner == null) {
         gc = GraphicsEnvironment.getLocalGraphicsEnvironment()
                 .getDefaultScreenDevice().getDefaultConfiguration();
     } else {
         gc = owner.getGraphicsConfiguration();
     }
     
     Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gc);
     Rectangle bounds = gc.getBounds();
     bounds.x += insets.left;
     bounds.y += insets.top;
     bounds.width -= (insets.left + insets.right);
     bounds.height -= (insets.top + insets.bottom);
     
     return bounds;
 }

}</source>





14. Get Screen Bounds For

   <source lang="java">

/*

* Copyright (C) 2001-2004 Colin Bell
* colbell@users.sourceforge.net
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

import java.awt.ruponent; import java.awt.Container; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Frame; import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.Insets; import java.awt.Point; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.Window; import java.awt.geom.Rectangle2D; import java.beans.PropertyVetoException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.SwingUtilities; /**

* Common GUI utilities accessed via static methods.
* 
* @author 
*/

public class GUIUtils {

 public static Rectangle getScreenBoundsFor(Rectangle rc) {
   final GraphicsDevice[] gds = GraphicsEnvironment.getLocalGraphicsEnvironment()
       .getScreenDevices();
   final List<GraphicsConfiguration> configs = new ArrayList<GraphicsConfiguration>();
   for (int i = 0; i < gds.length; i++) {
     GraphicsConfiguration gc = gds[i].getDefaultConfiguration();
     if (rc.intersects(gc.getBounds())) {
       configs.add(gc);
     }
   }
   GraphicsConfiguration selected = null;
   if (configs.size() > 0) {
     for (Iterator<GraphicsConfiguration> it = configs.iterator(); it.hasNext();) {
       GraphicsConfiguration gcc = it.next();
       if (selected == null)
         selected = gcc;
       else {
         if (gcc.getBounds().contains(rc.x + 20, rc.y + 20)) {
           selected = gcc;
           break;
         }
       }
     }
   } else {
     selected = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice()
         .getDefaultConfiguration();
   }
   int x = selected.getBounds().x;
   int y = selected.getBounds().y;
   int w = selected.getBounds().width;
   int h = selected.getBounds().height;
   return new Rectangle(x, y, w, h);
 }

}</source>





14. Get the JFrame by getting the root of a component

   <source lang="java">

import java.awt.Color; import java.awt.ruponent; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.SwingUtilities; public class Main extends JFrame {

 public Main() {
   this.setSize(400, 100);
   this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   this.setLayout(new FlowLayout(FlowLayout.CENTER));
   JButton button = new JButton("Change Frame Color");
   button.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent e) {
       Component component = (Component) e.getSource();
       JFrame frame = (JFrame) SwingUtilities.getRoot(component);
       frame.getContentPane().setBackground(Color.RED);
     }
   });
   this.getContentPane().add(button);
 }
 public static void main(String[] args) {
   new Main().setVisible(true);
 }

}</source>





14. Getting the JFrame of a Component

   <source lang="java">

import java.awt.ruponent; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.SwingUtilities; public class Main {

 public static void main(String[] argv) throws Exception {
   // Create an action
   Action action = new AbstractAction("Action Label") {
     // This method is called when the action is triggered
     public void actionPerformed(ActionEvent evt) {
       Component c = (Component) evt.getSource();
       // Get the frame
       Component frame = SwingUtilities.getRoot(c);
       // Hide the frame
       frame.setVisible(false);
     }
   };
 }

}</source>





14. Get Window from a component

   <source lang="java">

/*

* $Id: WindowUtils.java,v 1.16 2009/05/25 16:37:52 kschaefe Exp $
*
* Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

import java.awt.ruponent; import java.awt.Insets; import java.awt.Point; import java.awt.Window; import javax.swing.JOptionPane; /**

* Encapsulates various utilities for windows (ie: Frame and
* Dialog objects and descendants, in particular).
*
* @author Richard Bair
*/

public class Utils {

 public static Window findWindow(Component c) {
   if (c == null) {
       return JOptionPane.getRootFrame();
   } else if (c instanceof Window) {
       return (Window) c;
   } else {
       return findWindow(c.getParent());
   }

} }</source>





14. Handle long-running tasks in a Swing application

   <source lang="java">

import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class Main {

 private static JButton good = new JButton("Good");
 private static JLabel resultLabel = new JLabel("Ready", JLabel.CENTER);
 public static void main(String[] args) {
   JFrame f = new JFrame();
   f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   JPanel p = new JPanel();
   p.setOpaque(true);
   p.setLayout(new FlowLayout());
   p.add(good);
   f.add(p, BorderLayout.CENTER);
   f.add(resultLabel, BorderLayout.SOUTH);
   good.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent ev) {
       resultLabel.setText("Working . . .");
       good.setEnabled(false);
       Thread worker = new Thread() {
         public void run() {
           try {
             Thread.sleep(5000);
           } catch (InterruptedException ex) {
           }
           SwingUtilities.invokeLater(new Runnable() {
             public void run() {
               resultLabel.setText("Ready");
               good.setEnabled(true);
             }
           });
         }
       };
       worker.start(); // So we don"t hold up the dispatch thread.
     }
   });
   f.setSize(300, 100);
   f.setVisible(true);
 }

}</source>





14. Is Within Parent

   <source lang="java">

/*

* Copyright (C) 2001-2004 Colin Bell
* colbell@users.sourceforge.net
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

import java.awt.ruponent; import java.awt.Container; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Frame; import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.Insets; import java.awt.Point; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.Window; import java.awt.geom.Rectangle2D; import java.beans.PropertyVetoException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.SwingUtilities; /**

* Common GUI utilities accessed via static methods.
* 
* @author 
*/

public class GUIUtils {

 public static boolean isWithinParent(Component wind) {
   if (wind == null) {
     throw new IllegalArgumentException("Null Component passed");
   }
   Rectangle windowBounds = wind.getBounds();
   Component parent = wind.getParent();
   Rectangle parentRect = null;
   if (parent != null) {
     parentRect = new Rectangle(parent.getSize());
   } else {
     // parentRect = new
     // Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
     parentRect = getScreenBoundsFor(windowBounds);
   }
   // if (windowBounds.x > (parentRect.width - 20)
   // || windowBounds.y > (parentRect.height - 20)
   // || (windowBounds.x + windowBounds.width) < 20
   // || (windowBounds.y + windowBounds.height) < 20)
   // {
   // return false;
   // }
   if (windowBounds.x < (parentRect.x - 20) || windowBounds.y < (parentRect.y - 20)) {
     return false;
   }
   return true;
 }
 public static Rectangle getScreenBoundsFor(Rectangle rc) {
   final GraphicsDevice[] gds = GraphicsEnvironment.getLocalGraphicsEnvironment()
       .getScreenDevices();
   final List<GraphicsConfiguration> configs = new ArrayList<GraphicsConfiguration>();
   for (int i = 0; i < gds.length; i++) {
     GraphicsConfiguration gc = gds[i].getDefaultConfiguration();
     if (rc.intersects(gc.getBounds())) {
       configs.add(gc);
     }
   }
   GraphicsConfiguration selected = null;
   if (configs.size() > 0) {
     for (Iterator<GraphicsConfiguration> it = configs.iterator(); it.hasNext();) {
       GraphicsConfiguration gcc = it.next();
       if (selected == null)
         selected = gcc;
       else {
         if (gcc.getBounds().contains(rc.x + 20, rc.y + 20)) {
           selected = gcc;
           break;
         }
       }
     }
   } else {
     selected = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice()
         .getDefaultConfiguration();
   }
   int x = selected.getBounds().x;
   int y = selected.getBounds().y;
   int w = selected.getBounds().width;
   int h = selected.getBounds().height;
   return new Rectangle(x, y, w, h);
 }

}</source>





14. Positions the specified frame at a random location on the screen while ensuring that the

   <source lang="java">

entire frame is visible (provided that the frame is smaller than the screen). /*

* JCommon : a free general purpose class library for the Java(tm) platform
* 
*
* (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
*
* Project Info:  http://www.jfree.org/jcommon/index.html
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library 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 Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
* USA.
*
* [Java is a trademark or registered trademark of Sun Microsystems, Inc.
* in the United States and other countries.]
*
* ----------------------
* RefineryUtilities.java
* ----------------------
* (C) Copyright 2000-2005, by Object Refinery Limited.
*
* Original Author:  David Gilbert (for Object Refinery Limited);
* Contributor(s):   Jon Iles;
*
* $Id: RefineryUtilities.java,v 1.11 2007/11/02 17:50:36 taqua Exp $
*
* Changes (from 26-Oct-2001)
* --------------------------
* 26-Oct-2001 : Changed package to com.jrefinery.ui.*;
* 26-Nov-2001 : Changed name to SwingRefinery.java to make it obvious that this is not part of
*               the Java APIs (DG);
* 10-Dec-2001 : Changed name (again) to JRefineryUtilities.java (DG);
* 28-Feb-2002 : Moved system properties classes into com.jrefinery.ui.about (DG);
* 19-Apr-2002 : Renamed JRefineryUtilities-->RefineryUtilities.  Added drawRotatedString()
*               method (DG);
* 21-May-2002 : Changed frame positioning methods to accept Window parameters, as suggested by
*               Laurence Vanhelsuwe (DG);
* 27-May-2002 : Added getPointInRectangle method (DG);
* 26-Jun-2002 : Removed unnecessary imports (DG);
* 12-Jul-2002 : Added workaround for rotated text (JI);
* 14-Oct-2002 : Fixed errors reported by Checkstyle (DG);
* 08-May-2003 : Added a new drawRotatedString() method (DG);
* 09-May-2003 : Added a drawRotatedShape() method (DG);
* 10-Jun-2003 : Updated aligned and rotated string methods (DG);
* 29-Oct-2003 : Added workaround for font alignment in PDF output (DG);
* 07-Nov-2003 : Added rotateShape() method (DG);
* 16-Mar-2004 : Moved rotateShape() method to ShapeUtils.java (DG);
* 07-Apr-2004 : Modified text bounds calculation with TextUtilities.getTextBounds() (DG);
* 21-May-2004 : Fixed bug 951870 - precision in drawAlignedString() method (DG);
* 30-Sep-2004 : Deprecated and moved a number of methods to the TextUtilities class (DG);
* 04-Oct-2004 : Renamed ShapeUtils --> ShapeUtilities (DG);
* 11-Jan-2005 : Removed deprecated code in preparation for the 1.0.0 release (DG);
*
*/

import java.awt.Dimension; import java.awt.GraphicsEnvironment; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.Window; import java.lang.reflect.Method; /**

* 
* 
* @author David Gilbert
*/

public class Main {

 /**
  * Positions the specified frame at a random location on the screen while ensuring that the
  * entire frame is visible (provided that the frame is smaller than the screen).
  *
  * @param frame  the frame.
  */
 public static void positionFrameRandomly(final Window frame) {
     positionFrameOnScreen(frame, Math.random(), Math.random());
 }
 /**
  * Positions the specified frame at a relative position in the screen, where
  * 50% is considered to be the center of the screen.
  * 
  * @param frame
  *          the frame.
  * @param horizontalPercent
  *          the relative horizontal position of the frame (0.0 to 1.0, where
  *          0.5 is the center of the screen).
  * @param verticalPercent
  *          the relative vertical position of the frame (0.0 to 1.0, where 0.5
  *          is the center of the screen).
  */
 public static void positionFrameOnScreen(final Window frame, final double horizontalPercent,
     final double verticalPercent) {
   final Rectangle s = getMaximumWindowBounds();
   final Dimension f = frame.getSize();
   final int w = Math.max(s.width - f.width, 0);
   final int h = Math.max(s.height - f.height, 0);
   final int x = (int) (horizontalPercent * w) + s.x;
   final int y = (int) (verticalPercent * h) + s.y;
   frame.setBounds(x, y, f.width, f.height);
 }
 /**
  * Computes the maximum bounds of the current screen device. If this method is
  * called on JDK 1.4, Xinerama-aware results are returned. (See Sun-Bug-ID
  * 4463949 for details).
  * 
  * @return the maximum bounds of the current screen.
  */
 public static Rectangle getMaximumWindowBounds() {
   final GraphicsEnvironment localGraphicsEnvironment = GraphicsEnvironment
       .getLocalGraphicsEnvironment();
   try {
     final Method method = GraphicsEnvironment.class.getMethod("getMaximumWindowBounds",
         (Class[]) null);
     return (Rectangle) method.invoke(localGraphicsEnvironment, (Object[]) null);
   } catch (Exception e) {
     // ignore ... will fail if this is not a JDK 1.4 ..
   }
   final Dimension s = Toolkit.getDefaultToolkit().getScreenSize();
   return new Rectangle(0, 0, s.width, s.height);
 }

}</source>





14. Positions the specified frame at a relative position in the screen, where 50% is considered to be the center of the screen.

   <source lang="java">

/*

* JCommon : a free general purpose class library for the Java(tm) platform
* 
*
* (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
*
* Project Info:  http://www.jfree.org/jcommon/index.html
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library 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 Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
* USA.
*
* [Java is a trademark or registered trademark of Sun Microsystems, Inc.
* in the United States and other countries.]
*
* ----------------------
* RefineryUtilities.java
* ----------------------
* (C) Copyright 2000-2005, by Object Refinery Limited.
*
* Original Author:  David Gilbert (for Object Refinery Limited);
* Contributor(s):   Jon Iles;
*
* $Id: RefineryUtilities.java,v 1.11 2007/11/02 17:50:36 taqua Exp $
*
* Changes (from 26-Oct-2001)
* --------------------------
* 26-Oct-2001 : Changed package to com.jrefinery.ui.*;
* 26-Nov-2001 : Changed name to SwingRefinery.java to make it obvious that this is not part of
*               the Java APIs (DG);
* 10-Dec-2001 : Changed name (again) to JRefineryUtilities.java (DG);
* 28-Feb-2002 : Moved system properties classes into com.jrefinery.ui.about (DG);
* 19-Apr-2002 : Renamed JRefineryUtilities-->RefineryUtilities.  Added drawRotatedString()
*               method (DG);
* 21-May-2002 : Changed frame positioning methods to accept Window parameters, as suggested by
*               Laurence Vanhelsuwe (DG);
* 27-May-2002 : Added getPointInRectangle method (DG);
* 26-Jun-2002 : Removed unnecessary imports (DG);
* 12-Jul-2002 : Added workaround for rotated text (JI);
* 14-Oct-2002 : Fixed errors reported by Checkstyle (DG);
* 08-May-2003 : Added a new drawRotatedString() method (DG);
* 09-May-2003 : Added a drawRotatedShape() method (DG);
* 10-Jun-2003 : Updated aligned and rotated string methods (DG);
* 29-Oct-2003 : Added workaround for font alignment in PDF output (DG);
* 07-Nov-2003 : Added rotateShape() method (DG);
* 16-Mar-2004 : Moved rotateShape() method to ShapeUtils.java (DG);
* 07-Apr-2004 : Modified text bounds calculation with TextUtilities.getTextBounds() (DG);
* 21-May-2004 : Fixed bug 951870 - precision in drawAlignedString() method (DG);
* 30-Sep-2004 : Deprecated and moved a number of methods to the TextUtilities class (DG);
* 04-Oct-2004 : Renamed ShapeUtils --> ShapeUtilities (DG);
* 11-Jan-2005 : Removed deprecated code in preparation for the 1.0.0 release (DG);
*
*/

import java.awt.Dimension; import java.awt.GraphicsEnvironment; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.Window; import java.lang.reflect.Method; /**

* 
* 
* @author David Gilbert
*/

public class Main {

 /**
  * Positions the specified frame at a relative position in the screen, where
  * 50% is considered to be the center of the screen.
  * 
  * @param frame
  *          the frame.
  * @param horizontalPercent
  *          the relative horizontal position of the frame (0.0 to 1.0, where
  *          0.5 is the center of the screen).
  * @param verticalPercent
  *          the relative vertical position of the frame (0.0 to 1.0, where 0.5
  *          is the center of the screen).
  */
 public static void positionFrameOnScreen(final Window frame, final double horizontalPercent,
     final double verticalPercent) {
   final Rectangle s = getMaximumWindowBounds();
   final Dimension f = frame.getSize();
   final int w = Math.max(s.width - f.width, 0);
   final int h = Math.max(s.height - f.height, 0);
   final int x = (int) (horizontalPercent * w) + s.x;
   final int y = (int) (verticalPercent * h) + s.y;
   frame.setBounds(x, y, f.width, f.height);
 }
 /**
  * Computes the maximum bounds of the current screen device. If this method is
  * called on JDK 1.4, Xinerama-aware results are returned. (See Sun-Bug-ID
  * 4463949 for details).
  * 
  * @return the maximum bounds of the current screen.
  */
 public static Rectangle getMaximumWindowBounds() {
   final GraphicsEnvironment localGraphicsEnvironment = GraphicsEnvironment
       .getLocalGraphicsEnvironment();
   try {
     final Method method = GraphicsEnvironment.class.getMethod("getMaximumWindowBounds",
         (Class[]) null);
     return (Rectangle) method.invoke(localGraphicsEnvironment, (Object[]) null);
   } catch (Exception e) {
     // ignore ... will fail if this is not a JDK 1.4 ..
   }
   final Dimension s = Toolkit.getDefaultToolkit().getScreenSize();
   return new Rectangle(0, 0, s.width, s.height);
 }

}</source>





14. Positions the specified frame in the middle of the screen.

   <source lang="java">

/*

* JCommon : a free general purpose class library for the Java(tm) platform
* 
*
* (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
*
* Project Info:  http://www.jfree.org/jcommon/index.html
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library 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 Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
* USA.
*
* [Java is a trademark or registered trademark of Sun Microsystems, Inc.
* in the United States and other countries.]
*
* ----------------------
* RefineryUtilities.java
* ----------------------
* (C) Copyright 2000-2005, by Object Refinery Limited.
*
* Original Author:  David Gilbert (for Object Refinery Limited);
* Contributor(s):   Jon Iles;
*
* $Id: RefineryUtilities.java,v 1.11 2007/11/02 17:50:36 taqua Exp $
*
* Changes (from 26-Oct-2001)
* --------------------------
* 26-Oct-2001 : Changed package to com.jrefinery.ui.*;
* 26-Nov-2001 : Changed name to SwingRefinery.java to make it obvious that this is not part of
*               the Java APIs (DG);
* 10-Dec-2001 : Changed name (again) to JRefineryUtilities.java (DG);
* 28-Feb-2002 : Moved system properties classes into com.jrefinery.ui.about (DG);
* 19-Apr-2002 : Renamed JRefineryUtilities-->RefineryUtilities.  Added drawRotatedString()
*               method (DG);
* 21-May-2002 : Changed frame positioning methods to accept Window parameters, as suggested by
*               Laurence Vanhelsuwe (DG);
* 27-May-2002 : Added getPointInRectangle method (DG);
* 26-Jun-2002 : Removed unnecessary imports (DG);
* 12-Jul-2002 : Added workaround for rotated text (JI);
* 14-Oct-2002 : Fixed errors reported by Checkstyle (DG);
* 08-May-2003 : Added a new drawRotatedString() method (DG);
* 09-May-2003 : Added a drawRotatedShape() method (DG);
* 10-Jun-2003 : Updated aligned and rotated string methods (DG);
* 29-Oct-2003 : Added workaround for font alignment in PDF output (DG);
* 07-Nov-2003 : Added rotateShape() method (DG);
* 16-Mar-2004 : Moved rotateShape() method to ShapeUtils.java (DG);
* 07-Apr-2004 : Modified text bounds calculation with TextUtilities.getTextBounds() (DG);
* 21-May-2004 : Fixed bug 951870 - precision in drawAlignedString() method (DG);
* 30-Sep-2004 : Deprecated and moved a number of methods to the TextUtilities class (DG);
* 04-Oct-2004 : Renamed ShapeUtils --> ShapeUtilities (DG);
* 11-Jan-2005 : Removed deprecated code in preparation for the 1.0.0 release (DG);
*
*/

import java.awt.Dimension; import java.awt.GraphicsEnvironment; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.Window; import java.lang.reflect.Method; /**

* 
* 
* @author David Gilbert
*/

public class Main {

 /**
  * Positions the specified frame in the middle of the screen.
  *
  * @param frame  the frame to be centered on the screen.
  */
 public static void centerFrameOnScreen(final Window frame) {
     positionFrameOnScreen(frame, 0.5, 0.5);
 }
 /**
  * Positions the specified frame at a relative position in the screen, where
  * 50% is considered to be the center of the screen.
  * 
  * @param frame
  *          the frame.
  * @param horizontalPercent
  *          the relative horizontal position of the frame (0.0 to 1.0, where
  *          0.5 is the center of the screen).
  * @param verticalPercent
  *          the relative vertical position of the frame (0.0 to 1.0, where 0.5
  *          is the center of the screen).
  */
 public static void positionFrameOnScreen(final Window frame, final double horizontalPercent,
     final double verticalPercent) {
   final Rectangle s = getMaximumWindowBounds();
   final Dimension f = frame.getSize();
   final int w = Math.max(s.width - f.width, 0);
   final int h = Math.max(s.height - f.height, 0);
   final int x = (int) (horizontalPercent * w) + s.x;
   final int y = (int) (verticalPercent * h) + s.y;
   frame.setBounds(x, y, f.width, f.height);
 }
 /**
  * Computes the maximum bounds of the current screen device. If this method is
  * called on JDK 1.4, Xinerama-aware results are returned. (See Sun-Bug-ID
  * 4463949 for details).
  * 
  * @return the maximum bounds of the current screen.
  */
 public static Rectangle getMaximumWindowBounds() {
   final GraphicsEnvironment localGraphicsEnvironment = GraphicsEnvironment
       .getLocalGraphicsEnvironment();
   try {
     final Method method = GraphicsEnvironment.class.getMethod("getMaximumWindowBounds",
         (Class[]) null);
     return (Rectangle) method.invoke(localGraphicsEnvironment, (Object[]) null);
   } catch (Exception e) {
     // ignore ... will fail if this is not a JDK 1.4 ..
   }
   final Dimension s = Toolkit.getDefaultToolkit().getScreenSize();
   return new Rectangle(0, 0, s.width, s.height);
 }

}</source>





14. Returns the offset of the bracket matching the one at the specified offset of the document

   <source lang="java">

/*

* TextUtilities.java - Utility functions used by the text area classes
* Copyright (C) 1999 Slava Pestov
*
* You may use and modify this package for any purpose. Redistribution is
* permitted, in both source and binary form, provided that this notice
* remains intact in all source distributions of this package.
*/

import javax.swing.text.BadLocationException; import javax.swing.text.Document; /**

* Class with several utility functions used by the text area component.
* 
* @author Slava Pestov
* @version $Id$
*/

public class TextUtilities {

 /**
  * Returns the offset of the bracket matching the one at the specified offset
  * of the document, or -1 if the bracket is unmatched (or if the character is
  * not a bracket).
  * 
  * @param doc
  *           The document
  * @param offset
  *           The offset
  * @exception BadLocationException
  *               If an out-of-bounds access was attempted on the document
  *               text
  */
 public static int findMatchingBracket( Document doc, int offset ) throws BadLocationException
 {
   if( doc.getLength() == 0 )
     return -1;
   char c = doc.getText( offset, 1 ).charAt( 0 );
   char cprime; // c` - corresponding character
   boolean direction; // true = back, false = forward
   switch( c )
   {
   case "(" :
     cprime = ")";
     direction = false;
     break;
   case ")" :
     cprime = "(";
     direction = true;
     break;
   case "[" :
     cprime = "]";
     direction = false;
     break;
   case "]" :
     cprime = "[";
     direction = true;
     break;
   case "{" :
     cprime = "}";
     direction = false;
     break;
   case "}" :
     cprime = "{";
     direction = true;
     break;
   default :
     return -1;
   }
   int count;
   // How to merge these two cases is left as an exercise
   // for the reader.
   // Go back or forward
   if( direction )
   {
     // Count is 1 initially because we have already
     // `found" one closing bracket
     count = 1;
     // Get text[0,offset-1];
     String text = doc.getText( 0, offset );
     // Scan backwards
     for( int i = offset - 1; i >= 0; i-- )
     {
       // If text[i] == c, we have found another
       // closing bracket, therefore we will need
       // two opening brackets to complete the
       // match.
       char x = text.charAt( i );
       if( x == c )
         count++ ;
       // If text[i] == cprime, we have found a
       // opening bracket, so we return i if
       // --count == 0
       else if( x == cprime )
       {
         if( --count == 0 )
           return i;
       }
     }
   }
   else
   {
     // Count is 1 initially because we have already
     // `found" one opening bracket
     count = 1;
     // So we don"t have to + 1 in every loop
     offset++ ;
     // Number of characters to check
     int len = doc.getLength() - offset;
     // Get text[offset+1,len];
     String text = doc.getText( offset, len );
     // Scan forwards
     for( int i = 0; i < len; i++ )
     {
       // If text[i] == c, we have found another
       // opening bracket, therefore we will need
       // two closing brackets to complete the
       // match.
       char x = text.charAt( i );
       if( x == c )
         count++ ;
       // If text[i] == cprime, we have found an
       // closing bracket, so we return i if
       // --count == 0
       else if( x == cprime )
       {
         if( --count == 0 )
           return i + offset;
       }
     }
   }
   // Nothing found
   return -1;
 }

}</source>





14. Show the given frame as modal to the specified owner

   <source lang="java">

import java.awt.Frame; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import javax.swing.JFrame; // @author Santhosh Kumar T - santhosh@in.fiorano.ru public class ModalFrameUtil {

 static class EventPump implements InvocationHandler {
   Frame frame;
   public EventPump(Frame frame) {
     this.frame = frame;
   }
   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
     return frame.isShowing();
   }
   // when the reflection calls in this method has to be
   // replaced once Sun provides a public API to pump events.
   public void start() throws Exception {
     Class<?> clazz = Class.forName("java.awt.Conditional");
     Object conditional = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[] { clazz },
         this);
     Method pumpMethod = Class.forName("java.awt.EventDispatchThread").getDeclaredMethod(
         "pumpEvents", new Class[] { clazz });
     pumpMethod.setAccessible(true);
     pumpMethod.invoke(Thread.currentThread(), new Object[] { conditional });
   }
 }
 // show the given frame as modal to the specified owner.
 // NOTE: this method returns only after the modal frame is closed.
 public static void showAsModal(final Frame frame, final Frame owner) {
   frame.addWindowListener(new WindowAdapter() {
     public void windowOpened(WindowEvent e) {
       owner.setEnabled(false);
     }
     public void windowClosing(WindowEvent e) {
       owner.setEnabled(true);
       frame.removeWindowListener(this);
     }
     public void windowClosed(WindowEvent e) {
       owner.setEnabled(true);
       frame.removeWindowListener(this);
     }
   });
   owner.addWindowListener(new WindowAdapter() {
     public void windowActivated(WindowEvent e) {
       if (frame.isShowing()) {
         frame.setExtendedState(JFrame.NORMAL);
         frame.toFront();
       } else {
         owner.removeWindowListener(this);
       }
     }
   });
   frame.setVisible(true);
   try {
     new EventPump(frame).start();
   } catch (Throwable throwable) {
     throw new RuntimeException(throwable);
   }
 }

}</source>