Mega Code Archive

 
Categories / Java Tutorial / Swing
 

Specifying Window Decorations

/*  *  * Copyright (c) 1998 Sun Microsystems, Inc. All Rights Reserved.  *  * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,  * modify and redistribute this software in source and binary code form,  * provided that i) this copyright notice and license appear on all copies of  * the software; and ii) Licensee does not utilize the software in a manner  * which is disparaging to Sun.  *  * 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 AND ITS LICENSORS SHALL NOT BE  * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING  * OR DISTRIBUTING THE 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 SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE  * POSSIBILITY OF SUCH DAMAGES.  *  * This software is not designed or intended for use in on-line control of  * aircraft, air traffic, aircraft navigation or aircraft communications; or in  * the design, construction, operation or maintenance of any nuclear  * facility. Licensee represents and warrants that it will not use or  * redistribute the Software for such purposes.  */          import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.image.BufferedImage; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.UIManager; public class FrameDemo2 extends WindowAdapter implements ActionListener {   private Point lastLocation = null;   private int maxX = 500;   private int maxY = 500;   // the main frame's default button   private static JButton defaultButton = null;   // constants for action commands   protected final static String NO_DECORATIONS = "no_dec";   protected final static String LF_DECORATIONS = "laf_dec";   protected final static String WS_DECORATIONS = "ws_dec";   protected final static String CREATE_WINDOW = "new_win";   protected final static String DEFAULT_ICON = "def_icon";   protected final static String FILE_ICON = "file_icon";   protected final static String PAINT_ICON = "paint_icon";   // true if the next frame created should have no window decorations   protected boolean noDecorations = false;   // true if the next frame created should have setIconImage called   protected boolean specifyIcon = false;   // true if the next frame created should have a custom painted icon   protected boolean createIcon = false;   // Perform some initialization.   public FrameDemo2() {     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();     maxX = screenSize.width - 50;     maxY = screenSize.height - 50;   }   // Create a new MyFrame object and show it.   public void showNewWindow() {     JFrame frame = new MyFrame();     // Take care of the no window decorations case.     // NOTE: Unless you really need the functionality     // provided by JFrame, you would usually use a     // Window or JWindow instead of an undecorated JFrame.     if (noDecorations) {       frame.setUndecorated(true);     }     // Set window location.     if (lastLocation != null) {       // Move the window over and down 40 pixels.       lastLocation.translate(40, 40);       if ((lastLocation.x > maxX) || (lastLocation.y > maxY)) {         lastLocation.setLocation(0, 0);       }       frame.setLocation(lastLocation);     } else {       lastLocation = frame.getLocation();     }     // Calling setIconImage sets the icon displayed when the window     // is minimized. Most window systems (or look and feels, if     // decorations are provided by the look and feel) also use this     // icon in the window decorations.     if (specifyIcon) {       if (createIcon) {         frame.setIconImage(createFDImage()); // create an icon from scratch       } else {         frame.setIconImage(getFDImage()); // get the icon from a file       }     }     // Show window.     frame.setSize(new Dimension(170, 100));     frame.setVisible(true);   }   // Create the window-creation controls that go in the main window.   protected JComponent createOptionControls() {     JLabel label1 = new JLabel("Decoration options for subsequently created frames:");     ButtonGroup bg1 = new ButtonGroup();     JLabel label2 = new JLabel("Icon options:");     ButtonGroup bg2 = new ButtonGroup();     // Create the buttons     JRadioButton rb1 = new JRadioButton();     rb1.setText("Look and feel decorated");     rb1.setActionCommand(LF_DECORATIONS);     rb1.addActionListener(this);     rb1.setSelected(true);     bg1.add(rb1);     //     JRadioButton rb2 = new JRadioButton();     rb2.setText("Window system decorated");     rb2.setActionCommand(WS_DECORATIONS);     rb2.addActionListener(this);     bg1.add(rb2);     //     JRadioButton rb3 = new JRadioButton();     rb3.setText("No decorations");     rb3.setActionCommand(NO_DECORATIONS);     rb3.addActionListener(this);     bg1.add(rb3);     //     JRadioButton rb4 = new JRadioButton();     rb4.setText("Default icon");     rb4.setActionCommand(DEFAULT_ICON);     rb4.addActionListener(this);     rb4.setSelected(true);     bg2.add(rb4);     //     JRadioButton rb5 = new JRadioButton();     rb5.setText("Icon from a JPEG file");     rb5.setActionCommand(FILE_ICON);     rb5.addActionListener(this);     bg2.add(rb5);     //     JRadioButton rb6 = new JRadioButton();     rb6.setText("Painted icon");     rb6.setActionCommand(PAINT_ICON);     rb6.addActionListener(this);     bg2.add(rb6);     // Add everything to a container.     Box box = Box.createVerticalBox();     box.add(label1);     box.add(Box.createVerticalStrut(5)); // spacer     box.add(rb1);     box.add(rb2);     box.add(rb3);     //     box.add(Box.createVerticalStrut(15)); // spacer     box.add(label2);     box.add(Box.createVerticalStrut(5)); // spacer     box.add(rb4);     box.add(rb5);     box.add(rb6);     // Add some breathing room.     box.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));     return box;   }   // Create the button that goes in the main window.   protected JComponent createButtonPane() {     JButton button = new JButton("New window");     button.setActionCommand(CREATE_WINDOW);     button.addActionListener(this);     defaultButton = button; // Used later to make this the frame's default                             // button.     // Center the button in a panel with some space around it.     JPanel pane = new JPanel(); // use default FlowLayout     pane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));     pane.add(button);     return pane;   }   // Handle action events from all the buttons.   public void actionPerformed(ActionEvent e) {     String command = e.getActionCommand();     // Handle the New window button.     if (CREATE_WINDOW.equals(command)) {       showNewWindow();       // Handle the first group of radio buttons.     } else if (NO_DECORATIONS.equals(command)) {       noDecorations = true;       JFrame.setDefaultLookAndFeelDecorated(false);     } else if (WS_DECORATIONS.equals(command)) {       noDecorations = false;       JFrame.setDefaultLookAndFeelDecorated(false);     } else if (LF_DECORATIONS.equals(command)) {       noDecorations = false;       JFrame.setDefaultLookAndFeelDecorated(true);       // Handle the second group of radio buttons.     } else if (DEFAULT_ICON.equals(command)) {       specifyIcon = false;     } else if (FILE_ICON.equals(command)) {       specifyIcon = true;       createIcon = false;     } else if (PAINT_ICON.equals(command)) {       specifyIcon = true;       createIcon = true;     }   }   // Creates an icon-worthy Image from scratch.   protected static Image createFDImage() {     // Create a 16x16 pixel image.     BufferedImage bi = new BufferedImage(16, 16, BufferedImage.TYPE_INT_RGB);     // Draw into it.     Graphics g = bi.getGraphics();     g.setColor(Color.BLACK);     g.fillRect(0, 0, 15, 15);     g.setColor(Color.RED);     g.fillOval(5, 3, 6, 6);     // Clean up.     g.dispose();     // Return it.     return bi;   }   // Returns an Image or null.   protected static Image getFDImage() {     java.net.URL imgURL = FrameDemo2.class.getResource("images/FD.jpg");     if (imgURL != null) {       return new ImageIcon(imgURL).getImage();     } else {       return null;     }   }   /**    * Create the GUI and show it. For thread safety, this method should be    * invoked from the event-dispatching thread.    */   private static void createAndShowGUI() {     // Use the Java look and feel.     try {       UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());     } catch (Exception e) {     }     // Make sure we have nice window decorations.     JFrame.setDefaultLookAndFeelDecorated(true);     JDialog.setDefaultLookAndFeelDecorated(true);     // Instantiate the controlling class.     JFrame frame = new JFrame("FrameDemo2");     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     // Create and set up the content pane.     FrameDemo2 demo = new FrameDemo2();     // Add components to it.     Container contentPane = frame.getContentPane();     contentPane.add(demo.createOptionControls(), BorderLayout.CENTER);     contentPane.add(demo.createButtonPane(), BorderLayout.PAGE_END);     frame.getRootPane().setDefaultButton(defaultButton);     // Display the window.     frame.pack();     frame.setLocationRelativeTo(null); // center it     frame.setVisible(true);   }   // Start the demo.   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();       }     });   }   class MyFrame extends JFrame implements ActionListener {     // Create a frame with a button.     public MyFrame() {       super("A window");       setDefaultCloseOperation(DISPOSE_ON_CLOSE);       // This button lets you close even an undecorated window.       JButton button = new JButton("Close window");       button.addActionListener(this);       // Place the button near the bottom of the window.       Container contentPane = getContentPane();       contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.PAGE_AXIS));       contentPane.add(Box.createVerticalGlue()); // takes all extra space       contentPane.add(button);       button.setAlignmentX(Component.CENTER_ALIGNMENT); // horizontally centered       contentPane.add(Box.createVerticalStrut(5)); // spacer     }     // Make the button do the same thing as the default close operation     // (DISPOSE_ON_CLOSE).     public void actionPerformed(ActionEvent e) {       setVisible(false);       dispose();     }   } }