Mega Code Archive

 
Categories / Java / Swing JFC
 

Track Focus 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.  */ /*  * TrackFocusDemo.java is a 1.4 example that requires the following files:  * Picture.java images/Maya.jpg images/Anya.jpg images/Laine.jpg  * images/Cosmo.jpg images/Adele.jpg images/Alexi.jpg  */ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.Image; import java.awt.KeyboardFocusManager; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.accessibility.Accessible; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class TrackFocusDemo extends JPanel {   Picture pic1, pic2, pic3, pic4, pic5, pic6;   JLabel info;   static String mayaString = "Maya";   static String anyaString = "Anya";   static String laineString = "Laine";   static String cosmoString = "Cosmo";   static String adeleString = "Adele";   static String alexiString = "Alexi";   String[] comments = { "Oops. What is this?", "This is Maya",       "This is Anya", "This is Laine", "This is Cosmo", "This is Adele",       "This is Alexi" };   public TrackFocusDemo() {     super(new BorderLayout());     JPanel mugshots = new JPanel(new GridLayout(2, 3));     pic1 = new Picture(createImageIcon("images/" + mayaString + ".jpg",         mayaString).getImage());     pic1.setName("1");     mugshots.add(pic1);     pic2 = new Picture(createImageIcon("images/" + anyaString + ".jpg",         anyaString).getImage());     pic2.setName("2");     mugshots.add(pic2);     pic3 = new Picture(createImageIcon("images/" + laineString + ".jpg",         laineString).getImage());     pic3.setName("3");     mugshots.add(pic3);     pic4 = new Picture(createImageIcon("images/" + cosmoString + ".jpg",         cosmoString).getImage());     pic4.setName("4");     mugshots.add(pic4);     pic5 = new Picture(createImageIcon("images/" + adeleString + ".jpg",         adeleString).getImage());     pic5.setName("5");     mugshots.add(pic5);     pic6 = new Picture(createImageIcon("images/" + alexiString + ".jpg",         alexiString).getImage());     pic6.setName("6");     mugshots.add(pic6);     info = new JLabel("Nothing selected");     setPreferredSize(new Dimension(450, 350));     add(mugshots, BorderLayout.CENTER);     add(info, BorderLayout.PAGE_END);     setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));     KeyboardFocusManager focusManager = KeyboardFocusManager         .getCurrentKeyboardFocusManager();     focusManager.addPropertyChangeListener(new PropertyChangeListener() {       public void propertyChange(PropertyChangeEvent e) {         String prop = e.getPropertyName();         if (("focusOwner".equals(prop)) && (e.getNewValue() != null)             && ((e.getNewValue()) instanceof Picture)) {           Component comp = (Component) e.getNewValue();           String name = comp.getName();           Integer num = new Integer(name);           int index = num.intValue();           if (index < 0 || index > comments.length) {             index = 0;           }           info.setText(comments[index]);         }       }     });   }   /** Returns an ImageIcon, or null if the path was invalid. */   protected static ImageIcon createImageIcon(String path, String description) {     java.net.URL imageURL = TrackFocusDemo.class.getResource(path);     if (imageURL == null) {       System.err.println("Resource not found: " + path);       return null;     } else {       return new ImageIcon(imageURL, description);     }   }   /**    * 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("TrackFocusDemo");     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     JComponent newContentPane = new TrackFocusDemo();     newContentPane.setOpaque(true); //content panes must be opaque     frame.setContentPane(newContentPane);     //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();       }     });   } } /*  * Picture.java is used by the 1.4 TrackFocusDemo.java and DragPictureDemo.java  * examples.  */ class Picture extends JComponent implements MouseListener, FocusListener,     Accessible {   Image image;   public Picture(Image image) {     this.image = image;     setFocusable(true);     addMouseListener(this);     addFocusListener(this);   }   public void mouseClicked(MouseEvent e) {     //Since the user clicked on us, let's get focus!     requestFocusInWindow();   }   public void mouseEntered(MouseEvent e) {   }   public void mouseExited(MouseEvent e) {   }   public void mousePressed(MouseEvent e) {   }   public void mouseReleased(MouseEvent e) {   }   public void focusGained(FocusEvent e) {     //Draw the component with a red border     //indicating that it has focus.     this.repaint();   }   public void focusLost(FocusEvent e) {     //Draw the component with a black border     //indicating that it doesn't have focus.     this.repaint();   }   protected void paintComponent(Graphics graphics) {     Graphics g = graphics.create();     //Draw in our entire space, even if isOpaque is false.     g.setColor(Color.WHITE);     g.fillRect(0, 0, image == null ? 125 : image.getWidth(this),         image == null ? 125 : image.getHeight(this));     if (image != null) {       //Draw image at its natural size of 125x125.       g.drawImage(image, 0, 0, this);     }     //Add a border, red if picture currently has focus     if (isFocusOwner()) {       g.setColor(Color.RED);     } else {       g.setColor(Color.BLACK);     }     g.drawRect(0, 0, image == null ? 125 : image.getWidth(this),         image == null ? 125 : image.getHeight(this));     g.dispose();   } }