类 FocusTraversalPolicy 的使用方法

官方说明:

FocusTraversalPolicy 定义一种顺序,按此顺序遍历具有特定焦点循环根的 Component。实例可以将此策略应用于任意焦点循环根,允许它们在整个 Container 共享。当焦点循环根的组件层次结构更改时,不必重新初始化它们。

FocusTraversalPolicy 的核心职责是提供算法,在 UI 中进行向前或向后遍历时确定下一个和上一个要聚焦的 Component。每个 FocusTraversalPolicy 还必须提供算法,确定遍历循环中第一个、最后一个,以及默认的组件。进行正常的正向和反向遍历时,分别使用第一个和最后一个 Component。默认的 Component 是向下遍历到一个新的焦点遍历循环时接收焦点的第一个 Component。FocusTraversalPolicy 可以随意提供确定窗口初始 Component 的算法。初始 Component 是首次将窗口设置为可见时接收焦点的第一个 Component。

import javax.swing.*;
import java.awt.
*;
import java.util.
*;
import java.awt.
event.*;

public class MainFrame extends JFrame {

    
private static final long serialVersionUID = 1L;
    
private JPanel jContentPane = null;
    
private JTextField jTextField = null;
    
private JTextField jTextField1 = null;
    
private JTextField jTextField2 = null;
    
private JTextField jTextField3 = null;
    
private JTextField jTextField4 = null;
    
private JTextField jTextField5 = null;
    
private JTextField jTextField6 = null;
    
private JTextField jTextField7 = null;
    
private JTextField jTextField8 = null;
    
private JTextField jTextField9 = null;
    
static MyOwnFocusTraversalPolicy newPolicy;

    
/**
     * This method initializes jTextField    
     *     
     * @return javax.swing.JTextField    
     
*/
    
private JTextField getJTextField() {
        
if (jTextField == null) {
            jTextField 
= new JTextField();
            jTextField.setLocation(
new Point(3730));
            jTextField.setSize(
new Dimension(20022));
            jTextField.addActionListener(
new MyActionListener());
        }
        
return jTextField;
    }

    
/**
     * This method initializes jTextField1    
     *     
     * @return javax.swing.JTextField    
     
*/
    
private JTextField getJTextField1() {
        
if (jTextField1 == null) {
            jTextField1 
= new JTextField();
            jTextField1.setBounds(
new Rectangle(376020022));
            jTextField1.addActionListener(
new MyActionListener());
        }
        
return jTextField1;
    }

    
/**
     * This method initializes jTextField2    
     *     
     * @return javax.swing.JTextField    
     
*/
    
private JTextField getJTextField2() {
        
if (jTextField2 == null) {
            jTextField2 
= new JTextField();
            jTextField2.setBounds(
new Rectangle(379020022));
            jTextField2.addActionListener(
new MyActionListener());
        }
        
return jTextField2;
    }

    
/**
     * This method initializes jTextField3    
     *     
     * @return javax.swing.JTextField    
     
*/
    
private JTextField getJTextField3() {
        
if (jTextField3 == null) {
            jTextField3 
= new JTextField();
            jTextField3.setBounds(
new Rectangle(3712020022));
            jTextField3.addActionListener(
new MyActionListener());
        }
        
return jTextField3;
    }

    
/**
     * This method initializes jTextField4    
     *     
     * @return javax.swing.JTextField    
     
*/
    
private JTextField getJTextField4() {
        
if (jTextField4 == null) {
            jTextField4 
= new JTextField();
            jTextField4.setBounds(
new Rectangle(3715020022));
            jTextField4.addActionListener(
new MyActionListener());
        }
        
return jTextField4;
    }

    
/**
     * This method initializes jTextField5    
     *     
     * @return javax.swing.JTextField    
     
*/
    
private JTextField getJTextField5() {
        
if (jTextField5 == null) {
            jTextField5 
= new JTextField();
            jTextField5.setBounds(
new Rectangle(2553020022));
            jTextField5.addActionListener(
new MyActionListener());
        }
        
return jTextField5;
    }

    
/**
     * This method initializes jTextField6    
     *     
     * @return javax.swing.JTextField    
     
*/
    
private JTextField getJTextField6() {
        
if (jTextField6 == null) {
            jTextField6 
= new JTextField();
            jTextField6.setBounds(
new Rectangle(2556020022));
            jTextField6.addActionListener(
new MyActionListener());
        }
        
return jTextField6;
    }

    
/**
     * This method initializes jTextField7    
     *     
     * @return javax.swing.JTextField    
     
*/
    
private JTextField getJTextField7() {
        
if (jTextField7 == null) {
            jTextField7 
= new JTextField();
            jTextField7.setBounds(
new Rectangle(2559020022));
            jTextField7.addActionListener(
new MyActionListener());
        }
        
return jTextField7;
    }

    
/**
     * This method initializes jTextField8    
     *     
     * @return javax.swing.JTextField    
     
*/
    
private JTextField getJTextField8() {
        
if (jTextField8 == null) {
            jTextField8 
= new JTextField();
            jTextField8.setBounds(
new Rectangle(25512020022));
            jTextField8.addActionListener(
new MyActionListener());
        }
        
return jTextField8;
    }

    
/**
     * This method initializes jTextField9    
     *     
     * @return javax.swing.JTextField    
     
*/
    
private JTextField getJTextField9() {
        
if (jTextField9 == null) {
            jTextField9 
= new JTextField();
            jTextField9.setBounds(
new Rectangle(25515020022));
            jTextField9.addActionListener(
new MyActionListener());
        }
        
return jTextField9;
    }

    
/**
     * @param args
     
*/
    
public static void main(String[] args) {
        SwingUtilities.invokeLater(
new Runnable() {
            
public void run() {
                MainFrame thisClass 
= new MainFrame();
                thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                thisClass.setVisible(
true);
                thisClass.setFocusTraversalPolicy(newPolicy);
            }
        });
    }

    
/**
     * This is the default constructor
     
*/
    
public MainFrame() {
        super();
        initialize();
    }

    
/**
     * This method initializes this
     * 
     * @return void
     
*/
    
private void initialize() {
        
this.setSize(491259);
        
this.setContentPane(getJContentPane());
        
this.setTitle("JFrame");
    }

    
/**
     * This method initializes jContentPane
     * 
     * @return javax.swing.JPanel
     
*/
    
private JPanel getJContentPane() {
        
if (jContentPane == null) {
            jContentPane 
= new JPanel();
            jContentPane.setLayout(
null);
            jContentPane.add(getJTextField(), 
null);
            jContentPane.add(getJTextField1(), 
null);
            jContentPane.add(getJTextField2(), 
null);
            jContentPane.add(getJTextField3(), 
null);
            jContentPane.add(getJTextField4(), 
null);
            jContentPane.add(getJTextField5(), 
null);
            jContentPane.add(getJTextField6(), 
null);
            jContentPane.add(getJTextField7(), 
null);
            jContentPane.add(getJTextField8(), 
null);
            jContentPane.add(getJTextField9(), 
null);
            Vector
<Component> order = new Vector<Component>(10);
            order.add(getJTextField());
            order.add(getJTextField1());
            order.add(getJTextField2());
            order.add(getJTextField3());
            order.add(getJTextField4());
            order.add(getJTextField5());
            order.add(getJTextField6());
            order.add(getJTextField7());
            order.add(getJTextField8());
            order.add(getJTextField9());
            newPolicy 
= new MyOwnFocusTraversalPolicy(order);
        }
        
return jContentPane;
    }

    
class MyActionListener implements ActionListener { // 所有文本框都加入此ActionListener
        public void actionPerformed(ActionEvent e) {
            ((JTextField) e.getSource()).transferFocus();
// 按【Enter】键,focus往下一个组件
        }
    }

    
    
//内置类,实现TAB按照指定规则设置
    public static class MyOwnFocusTraversalPolicy extends FocusTraversalPolicy {
        Vector
<Component> order;

        
public MyOwnFocusTraversalPolicy(Vector<Component> order) {
            
this.order = new Vector<Component>(order.size());
            
this.order.addAll(order);
        }

        
public Component getComponentAfter(Container focusCycleRoot,
                Component aComponent) {
            
int idx = (order.indexOf(aComponent) + 1% order.size();
            
return order.get(idx);
        }

        
public Component getComponentBefore(Container focusCycleRoot,
                Component aComponent) {
            
int idx = order.indexOf(aComponent) - 1;
            
if (idx < 0) {
                idx 
= order.size() - 1;
            }
            
return order.get(idx);
        }

        
public Component getDefaultComponent(Container focusCycleRoot) {
            
return order.get(0);
        }

        
public Component getLastComponent(Container focusCycleRoot) {
            
return order.lastElement();
        }

        
public Component getFirstComponent(Container focusCycleRoot) {
            
return order.get(0);
        }
    }
}  

本程序还可以实现按键盘【Enter】键循环遍历所有文本框。

原文地址:https://www.cnblogs.com/qixin622/p/1520223.html