类 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(37, 30));
            jTextField.setSize(new Dimension(200, 22));
            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(37, 60, 200, 22));
            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(37, 90, 200, 22));
            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(37, 120, 200, 22));
            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(37, 150, 200, 22));
            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(255, 30, 200, 22));
            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(255, 60, 200, 22));
            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(255, 90, 200, 22));
            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(255, 120, 200, 22));
            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(255, 150, 200, 22));
            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(491, 259);
        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】键循环遍历所有文本框。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你希望一个对象可以被遍历按钮,你需要为该对象添加一个遍历焦点(Traversal Focus)。遍历焦点是用户在通过 Tab 键切换控件时所关注的焦点。 以下是在 Java Swing 中为一个对象添加遍历焦点的步骤: 1. 在对象的构造函数中调用 setFocusable(true) 方法,以确保该对象可以接收焦点。 2. 在父容器中调用 setFocusTraversalPolicy() 方法,并传入一个新的 FocusTraversalPolicy 对象。该对象用于定义遍历顺序。 3. 在 FocusTraversalPolicy 对象中,重写 getComponentAfter() 和 getComponentBefore() 方法,返回下一个和上一个焦点对象。 例如,在以下示例中,我们创建了一个 JPanel 对象,并将其添加到 JFrame 中。然后,我们为 JPanel 对象添加了三个 JButton 按钮,并为该 JPanel 对象设置了一个遍历焦点。这样,用户可以使用 Tab 键在按钮之间进行遍历。 ``` import java.awt.*; import javax.swing.*; public class TraversalDemo extends JFrame { public TraversalDemo() { JPanel panel = new JPanel(); panel.setLayout(new GridLayout(3, 1)); panel.setFocusable(true); JButton button1 = new JButton("Button 1"); JButton button2 = new JButton("Button 2"); JButton button3 = new JButton("Button 3"); panel.add(button1); panel.add(button2); panel.add(button3); // Set the traversal policy for the panel panel.setFocusTraversalPolicy(new MyFocusTraversalPolicy(button1, button2, button3)); getContentPane().add(panel); pack(); setVisible(true); } public static void main(String[] args) { new TraversalDemo(); } // Define the focus traversal policy class MyFocusTraversalPolicy extends FocusTraversalPolicy { private Component[] components; public MyFocusTraversalPolicy(Component... components) { this.components = components; } public Component getDefaultComponent(Container focusCycleRoot) { return components[0]; } public Component getFirstComponent(Container focusCycleRoot) { return components[0]; } public Component getLastComponent(Container focusCycleRoot) { return components[components.length - 1]; } public Component getComponentAfter(Container focusCycleRoot, Component aComponent) { int index = (getIndex(aComponent) + 1) % components.length; return components[index]; } public Component getComponentBefore(Container focusCycleRoot, Component aComponent) { int index = getIndex(aComponent) - 1; if (index < 0) { index = components.length - 1; } return components[index]; } private int getIndex(Component aComponent) { for (int i = 0; i < components.length; i++) { if (components[i] == aComponent) { return i; } } return -1; } } } ``` 在上面的示例中,我们创建了一个 MyFocusTraversalPolicy ,该实现了 FocusTraversalPolicy 接口,并重写了 getComponentAfter() 和 getComponentBefore() 方法。这些方法决定了遍历焦点对象的顺序。在构造函数中,我们将三个 JButton 传递给 MyFocusTraversalPolicy,以便在 getComponentAfter() 和 getComponentBefore() 方法使用。 最后,我们将 MyFocusTraversalPolicy 对象设置为 JPanel 的遍历焦点策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值