Mega Code Archive

 
Categories / Java / Swing JFC
 

FrameDemo2 java shows off the window decoration features added in 1 4

/*  * Copyright (c) 1995 - 2008 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:  *  *   - Redistributions of source code must retain the above copyright  *     notice, this list of conditions and the following disclaimer.  *  *   - Redistributions 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 nor the names of its  *     contributors may be used to endorse or promote products derived  *     from this software without specific prior written permission.  *  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  */ 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; /*  * FrameDemo2.java shows off the window decoration features added in 1.4, plus  * some window positioning code and (optionally) setIconImage. It uses the file  * images/FD.jpg.  */ 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();     }   } }