Focus Traversal 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.

 */



import java.awt.BorderLayout;

import java.awt.Component;

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(43);

    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.<p>Control-Tab (or Control-Shift-Tab) allows you to break out of the JTable.</html>");



    JPanel leftTextPanel = new JPanel(new GridLayout(32));

    leftTextPanel.add(tf1, BorderLayout.PAGE_START);

    leftTextPanel.add(tf3, BorderLayout.CENTER);

    leftTextPanel.add(tf5, BorderLayout.PAGE_END);

    leftTextPanel.setBorder(BorderFactory.createEmptyBorder(0055));

    JPanel rightTextPanel = new JPanel(new GridLayout(32));

    rightTextPanel.add(tf2, BorderLayout.PAGE_START);

    rightTextPanel.add(tf4, BorderLayout.CENTER);

    rightTextPanel.add(tf6, BorderLayout.PAGE_END);

    rightTextPanel.setBorder(BorderFactory.createEmptyBorder(0055));

    JPanel tablePanel = new JPanel(new GridLayout(01));

    tablePanel.add(table, BorderLayout.CENTER);

    tablePanel.setBorder(BorderFactory.createEtchedBorder());

    JPanel bottomPanel = new JPanel(new GridLayout(21));

    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(20202020));

  }



  //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;

    }

  }

}



           

       

Tags: , , , , ,

Leave a Reply