Java/Swing JFC/Focus — различия между версиями
Admin (обсуждение | вклад) м (1 версия) |
|
(нет различий)
|
Текущая версия на 09:44, 1 июня 2010
Содержание
- 1 Button Focus
- 2 Focus Concepts Demo
- 3 Focus Cycle Sample
- 4 Focus Example
- 5 Focus Traversal Demo
- 6 Focus Traversal Example
- 7 Handling Focus Changes
- 8 Requests focus for a component
- 9 Requests focus unless the component already has focus
- 10 Track Focus Demo
- 11 Use this method to determine whether a particular component has the focus
Button Focus
<source lang="java">
import java.awt.Container; import java.awt.FlowLayout; import javax.swing.JButton; import javax.swing.JFrame; public class ButtonFocus {
public static void main(String args[]) { JFrame frame = new JFrame("Action Sample"); JButton focusButton = new JButton("Focused"); JButton notFocusButton = new JButton("Not Focused"); Container contentPane = frame.getContentPane(); contentPane.setLayout(new FlowLayout()); contentPane.add(focusButton); contentPane.add(notFocusButton); frame.setSize(300, 100); frame.setVisible(true); }
}
</source>
Focus Concepts Demo
<source lang="java">
/* From http://java.sun.ru/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. */
import java.awt.BorderLayout; import java.awt.GridLayout; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; /*
* FocusConceptsDemo.java is a 1.4 example that requires no other files. */
public class FocusConceptsDemo extends JPanel {
static JFrame frame; JTextField t1, t2, t3, t4; JButton b1, b2, b3, b4; JTextArea text1; public FocusConceptsDemo() { super(new BorderLayout()); b1 = new JButton("JButton"); b2 = new JButton("JButton"); b3 = new JButton("JButton"); b4 = new JButton("JButton"); JPanel buttonPanel = new JPanel(new GridLayout(1, 1)); buttonPanel.add(b1); buttonPanel.add(b2); buttonPanel.add(b3); buttonPanel.add(b4); text1 = new JTextArea("JTextArea", 15, 40); JPanel textAreaPanel = new JPanel(new BorderLayout()); textAreaPanel.add(text1, BorderLayout.CENTER); t1 = new JTextField("JTextField"); t2 = new JTextField("JTextField"); t3 = new JTextField("JTextField"); t4 = new JTextField("JTextField"); JPanel textFieldPanel = new JPanel(new GridLayout(1, 1)); textFieldPanel.add(t1); textFieldPanel.add(t2); textFieldPanel.add(t3); textFieldPanel.add(t4); add(buttonPanel, BorderLayout.PAGE_START); add(textAreaPanel, BorderLayout.CENTER); add(textFieldPanel, BorderLayout.PAGE_END); setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); } /** * 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. frame = new JFrame("FocusConceptsDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Create and set up the content pane. JComponent newContentPane = new FocusConceptsDemo(); 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(); } }); }
}
</source>
Focus Cycle Sample
<source lang="java">
import java.awt.Container; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class FocusCycleSample {
public static void main(String args[]) { JFrame frame = new JFrame("Focus Cycle Sample"); Container contentPane = frame.getContentPane(); contentPane.setLayout(new GridLayout(3,3)); for (int i = 0; i < 8; i++) { JButton button = new JButton("" + i); contentPane.add(button); } JPanel panel = new FocusCycleConstrainedJPanel(); panel.setLayout(new GridLayout(1, 3)); for (int i = 0; i < 3; i++) { JButton button = new JButton("" + (i + 3)); panel.add(button); } contentPane.add(panel); frame.setSize(300, 200); frame.setVisible(true); }
} class FocusCycleConstrainedJPanel extends JPanel {
public boolean isFocusCycleRoot() { return true; }
}
</source>
Focus Example
<source lang="java">
import java.awt.AWTKeyStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.KeyboardFocusManager; import java.awt.event.KeyEvent; import javax.swing.JButton; import javax.swing.JDesktopPane; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.JPanel; public class FocusExample extends JFrame {
public FocusExample() { super("Focus Example"); setDefaultCloseOperation(EXIT_ON_CLOSE); MyPanel mypanel = new MyPanel(); JButton button1 = new JButton("One"); JButton button2 = new JButton("Two"); JButton button3 = new JButton("Three"); JButton button4 = new JButton("Four"); JButton button5 = new MyButton("Five*"); JButton button6 = new MyButton("Six*"); JButton button7 = new JButton("Seven"); mypanel.add(button2); mypanel.add(button3); JInternalFrame frame1 = new JInternalFrame("Internal Frame 1", true, true, true, true); frame1.setBackground(Color.lightGray); frame1.getContentPane().setLayout(new GridLayout(2, 3)); frame1.setSize(300, 200); frame1.getContentPane().add(button1); frame1.getContentPane().add(mypanel); frame1.getContentPane().add(button4); frame1.getContentPane().add(button5); frame1.getContentPane().add(button6); frame1.getContentPane().add(button7); JDesktopPane desktop = new JDesktopPane(); desktop.add(frame1, new Integer(1)); desktop.setOpaque(true); // Now set up the user interface window. Container contentPane = getContentPane(); contentPane.add(desktop, BorderLayout.CENTER); setSize(new Dimension(400, 300)); frame1.setVisible(true); setVisible(true); } public static void main(String[] args) { new FocusExample(); } class MyButton extends JButton { public MyButton(String s) { super(s); } public boolean isFocusable() { return false; } } class MyPanel extends JPanel { public MyPanel() { super(true); java.util.Set upKeys = new java.util.HashSet(1); upKeys.add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_UP, 0)); setFocusTraversalKeys(KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS, upKeys); } public boolean isFocusCycleRoot() { return true; } }
}
</source>
Focus Traversal Demo
<source lang="java">
/* From http://java.sun.ru/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. */
import java.awt.BorderLayout; import java.awt.ruponent; import java.awt.Container; import java.awt.FocusTraversalPolicy; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.JTextField; /*
* FocusTraversalDemo.java is a 1.4 example that requires no other files. */
public class FocusTraversalDemo extends JPanel implements ActionListener {
static JFrame frame; JTextField tf1, tf2, tf3, tf4, tf5, tf6; JTable table; JLabel label; JCheckBox togglePolicy; static MyOwnFocusTraversalPolicy newPolicy; public FocusTraversalDemo() { super(new BorderLayout()); newPolicy = new MyOwnFocusTraversalPolicy(); tf1 = new JTextField("Field 1"); tf2 = new JTextField("A Bigger Field 2"); tf3 = new JTextField("Field 3"); tf4 = new JTextField("A Bigger Field 4"); tf5 = new JTextField("Field 5"); tf6 = new JTextField("A Bigger Field 6"); table = new JTable(4, 3); togglePolicy = new JCheckBox("Custom FocusTraversalPolicy"); togglePolicy.setActionCommand("toggle"); togglePolicy.addActionListener(this); togglePolicy.setFocusable(false); //Remove it from the focus cycle. //Note that HTML is allowed and will break this run of text //across two lines. label = new JLabel("<html>Use Tab (or Shift-Tab) to navigate from component to component.
Control-Tab (or Control-Shift-Tab) allows you to break out of the JTable.</html>"); JPanel leftTextPanel = new JPanel(new GridLayout(3, 2)); leftTextPanel.add(tf1, BorderLayout.PAGE_START); leftTextPanel.add(tf3, BorderLayout.CENTER); leftTextPanel.add(tf5, BorderLayout.PAGE_END); leftTextPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 5)); JPanel rightTextPanel = new JPanel(new GridLayout(3, 2)); rightTextPanel.add(tf2, BorderLayout.PAGE_START); rightTextPanel.add(tf4, BorderLayout.CENTER); rightTextPanel.add(tf6, BorderLayout.PAGE_END); rightTextPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 5)); JPanel tablePanel = new JPanel(new GridLayout(0, 1)); tablePanel.add(table, BorderLayout.CENTER); tablePanel.setBorder(BorderFactory.createEtchedBorder()); JPanel bottomPanel = new JPanel(new GridLayout(2, 1)); bottomPanel.add(togglePolicy, BorderLayout.PAGE_START); bottomPanel.add(label, BorderLayout.PAGE_END); add(leftTextPanel, BorderLayout.LINE_START); add(rightTextPanel, BorderLayout.CENTER); add(tablePanel, BorderLayout.LINE_END); add(bottomPanel, BorderLayout.PAGE_END); setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); } //Turn the custom focus traversal policy on/off, //according to the checkbox public void actionPerformed(ActionEvent e) { if ("toggle".equals(e.getActionCommand())) { frame.setFocusTraversalPolicy(togglePolicy.isSelected() ? newPolicy : null); } } /** * 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. frame = new JFrame("FocusTraversalDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Create and set up the content pane. JComponent newContentPane = new FocusTraversalDemo(); 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(); } }); } public class MyOwnFocusTraversalPolicy extends FocusTraversalPolicy { public Component getComponentAfter(Container focusCycleRoot, Component aComponent) { if (aComponent.equals(tf1)) { return tf2; } else if (aComponent.equals(tf2)) { return tf3; } else if (aComponent.equals(tf3)) { return tf4; } else if (aComponent.equals(tf4)) { return tf5; } else if (aComponent.equals(tf5)) { return tf6; } else if (aComponent.equals(tf6)) { return table; } else if (aComponent.equals(table)) { return tf1; } return tf1; } public Component getComponentBefore(Container focusCycleRoot, Component aComponent) { if (aComponent.equals(tf1)) { return table; } else if (aComponent.equals(tf2)) { return tf1; } else if (aComponent.equals(tf3)) { return tf2; } else if (aComponent.equals(tf4)) { return tf3; } else if (aComponent.equals(tf5)) { return tf4; } else if (aComponent.equals(tf6)) { return tf5; } else if (aComponent.equals(table)) { return tf6; } return tf1; } public Component getDefaultComponent(Container focusCycleRoot) { return tf1; } public Component getLastComponent(Container focusCycleRoot) { return table; } public Component getFirstComponent(Container focusCycleRoot) { return tf1; } } } </source>
Focus Traversal Example
<source lang="java">
/* Java Swing, 2nd Edition By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole ISBN: 0-596-00408-7 Publisher: O"Reilly
- /
// FocusTraversalExample.java //Similar to the FocusExample, this class uses the custom AlphaButtonPolicy //focus traversal policy to navigate another small set of buttons. // import java.awt.Color; import java.awt.ruponent; import java.awt.Container; import java.awt.FocusTraversalPolicy; import java.awt.GridLayout; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class FocusTraversalExample extends JPanel {
public FocusTraversalExample() { setLayout(new GridLayout(6, 1)); JButton button1 = new JButton("Texas"); JButton button2 = new JButton("Vermont"); JButton button3 = new JButton("Florida"); JButton button4 = new JButton("Alabama"); JButton button5 = new JButton("Minnesota"); JButton button6 = new JButton("California"); setBackground(Color.lightGray); add(button1); add(button2); add(button3); add(button4); add(button5); add(button6); } public static void main(String[] args) { JFrame frame = new JFrame("Alphabetized Button Focus Traversal"); frame.setFocusTraversalPolicy(new AlphaButtonPolicy()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setContentPane(new FocusTraversalExample()); frame.setSize(400, 300); frame.setVisible(true); }
} //AlphaButtonPolicy.java //A custom focus traversal policy that uses alphabetical ordering of button //labels to determine "next" and "previous" buttons for keyboard traversal. // class AlphaButtonPolicy extends FocusTraversalPolicy {
private SortedMap getSortedButtons(Container focusCycleRoot) { if (focusCycleRoot == null) { throw new IllegalArgumentException("focusCycleRoot can"t be null"); } SortedMap result = new TreeMap(); // Will sort all buttons by text. sortRecursive(result, focusCycleRoot); return result; } private void sortRecursive(Map buttons, Container container) { for (int i = 0; i < container.getComponentCount(); i++) { Component c = container.getComponent(i); if (c instanceof JButton) { // Found another button to sort. buttons.put(((JButton) c).getText(), c); } if (c instanceof Container) { // Found a container to search. sortRecursive(buttons, (Container) c); } } } // The rest of the code implements the FocusTraversalPolicy interface. public Component getFirstComponent(Container focusCycleRoot) { SortedMap buttons = getSortedButtons(focusCycleRoot); if (buttons.isEmpty()) { return null; } return (Component) buttons.get(buttons.firstKey()); } public Component getLastComponent(Container focusCycleRoot) { SortedMap buttons = getSortedButtons(focusCycleRoot); if (buttons.isEmpty()) { return null; } return (Component) buttons.get(buttons.lastKey()); } public Component getDefaultComponent(Container focusCycleRoot) { return getFirstComponent(focusCycleRoot); } public Component getComponentAfter(Container focusCycleRoot, Component aComponent) { if (!(aComponent instanceof JButton)) { return null; } SortedMap buttons = getSortedButtons(focusCycleRoot); // Find all buttons after the current one. String nextName = ((JButton) aComponent).getText() + "\0"; SortedMap nextButtons = buttons.tailMap(nextName); if (nextButtons.isEmpty()) { // Wrapped back to beginning if (!buttons.isEmpty()) { return (Component) buttons.get(buttons.firstKey()); } return null; // Degenerate case of no buttons. } return (Component) nextButtons.get(nextButtons.firstKey()); } public Component getComponentBefore(Container focusCycleRoot, Component aComponent) { if (!(aComponent instanceof JButton)) { return null; } SortedMap buttons = getSortedButtons(focusCycleRoot); SortedMap prevButtons = // Find all buttons before this one. buttons.headMap(((JButton) aComponent).getText()); if (prevButtons.isEmpty()) { // Wrapped back to end. if (!buttons.isEmpty()) { return (Component) buttons.get(buttons.lastKey()); } return null; // Degenerate case of no buttons. } return (Component) prevButtons.get(prevButtons.lastKey()); }
}
</source>
Handling Focus Changes
<source lang="java">
import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import javax.swing.JFrame; import javax.swing.JTextField; public class Main {
public static void main(String[] argv) throws Exception { JTextField component = new JTextField(); component.addFocusListener(new MyFocusListener()); JFrame f = new JFrame(); f.add(component); f.setSize(300, 300); f.setVisible(true); }
} class MyFocusListener extends FocusAdapter {
public void focusGained(FocusEvent evt) { System.out.println("component gained the focus"); } public void focusLost(FocusEvent evt) { System.out.println("component lost the focus"); }
}
</source>
Requests focus for a component
<source lang="java">
import java.awt.ruponent; import java.awt.Container; import java.awt.FocusTraversalPolicy; import java.awt.KeyboardFocusManager; import javax.swing.JComponent; /**
* Copyright (C) 2004 NNL Technology AB * Visit www.infonode.net for information about InfoNode(R) * products and how to contact NNL Technology AB. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. */
// $Id: ComponentUtil.java,v 1.25 2005/12/04 13:46:04 jesper Exp $
public class Util {
/** * Requests focus for a component. If that"s not possible it"s * {@link FocusTraversalPolicy}is checked. If that doesn"t work all it"s * children is recursively checked with this method. * * @param component the component to request focus for * @return the component which has focus or probably will obtain focus, null * if no component will receive focus */ public static Component smartRequestFocus(Component component) { if (requestFocus(component)) return component; if (component instanceof JComponent) { FocusTraversalPolicy policy = ((JComponent) component).getFocusTraversalPolicy(); if (policy != null) { Component focusComponent = policy.getDefaultComponent((Container) component); if (focusComponent != null && requestFocus(focusComponent)) { return focusComponent; } } } if (component instanceof Container) { Component[] children = ((Container) component).getComponents(); for (int i = 0; i < children.length; i++) { component = smartRequestFocus(children[i]); if (component != null) return component; } } return null; } /** * Requests focus unless the component already has focus. For some weird * reason calling {@link Component#requestFocusInWindow()}when the * component is focus owner changes focus owner to another component! * * @param component the component to request focus for * @return true if the component has focus or probably will get focus, * otherwise false */ public static boolean requestFocus(Component component) { /* * System.out.println("Owner: " + * System.identityHashCode(KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner()) + ", " + * System.identityHashCode(component) + ", " + * (KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() == * component)); */ return KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() == component || component.requestFocusInWindow(); }
}
</source>
Requests focus unless the component already has focus
<source lang="java">
import java.awt.ruponent; import java.awt.KeyboardFocusManager; /**
* Copyright (C) 2004 NNL Technology AB * Visit www.infonode.net for information about InfoNode(R) * products and how to contact NNL Technology AB. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. */
// $Id: ComponentUtil.java,v 1.25 2005/12/04 13:46:04 jesper Exp $
public class Util {
/** * Requests focus unless the component already has focus. For some weird * reason calling {@link Component#requestFocusInWindow()}when the * component is focus owner changes focus owner to another component! * * @param component the component to request focus for * @return true if the component has focus or probably will get focus, * otherwise false */ public static boolean requestFocus(Component component) { /* * System.out.println("Owner: " + * System.identityHashCode(KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner()) + ", " + * System.identityHashCode(component) + ", " + * (KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() == * component)); */ return KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() == component || component.requestFocusInWindow(); }
}
</source>
Track Focus Demo
<source lang="java">
/* From http://java.sun.ru/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.ruponent; 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(); }
}
</source>
Use this method to determine whether a particular component has the focus
<source lang="java">
import javax.swing.JFrame; public class Main {
public static void main() { JFrame f = new JFrame(); boolean b = f.isFocusOwner(); }
}
</source>