更改Jcomponent的选项卡遍历顺序?

时间:2014-08-29 21:40:57

标签: java swing focus tab-ordering

我有一个由许多小组件组成的大组件,那么将用于确定这些小组件的Tab键顺序?

另外,有没有办法为JComponent设置FocusTraversalPolicy

1 个答案:

答案 0 :(得分:2)

  

另外,有没有办法为FocusTraversalPolicy设置JComponent

是。看看How to Use the Focus Subsystem。有一个部分Customizing Focus Traversal通过一个完整的示例FocusTraversalDemo来解释如何执行此操作。它基本上创建了一个扩展FocusTraversalPolicy的类,其中它覆盖了一些方法以确定组件遍历的顺序


<强>更新

以下是一个使用RandomFocusTraversalPolicy的示例,正​​如其名称所暗示的那样。遍历是随机的。

enter image description here

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.FocusTraversalPolicy;
import java.awt.GridLayout;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class FocusTraversalDemo extends JComponent {

    List<Component> components = new ArrayList<Component>();

    public FocusTraversalDemo() {
        setFocusTraversalPolicyProvider(true);
        setLayout(new GridLayout(5, 5, 10, 10));
        initComponents();
        setFocusTraversalPolicy(new RandomFocusTraversalPolicy(components));
    }

    private void initComponents() {
        for (int i = 0; i < 25; i++) {
            final JButton button = new JButton("Button " + i);
            final Color defaultColor = button.getForeground();
            button.addFocusListener(new FocusListener(){
                @Override
                public void focusGained(FocusEvent e) {
                    button.setForeground(Color.BLUE);
                }
                @Override
                public void focusLost(FocusEvent e) {
                    button.setForeground(defaultColor);
                }
            });
            this.add(button);
            components.add(button);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new FocusTraversalDemo());
                frame.pack();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class RandomFocusTraversalPolicy extends FocusTraversalPolicy {

        private List<Component> comps;

        public RandomFocusTraversalPolicy(List<Component> comps) {
            this.comps = comps;
        }

        @Override
        public Component getComponentAfter(Container aContainer, Component aComponent) {
            return comps.get(getRandomIndex());

        }

        @Override
        public Component getComponentBefore(Container aContainer, Component aComponent) {
            return comps.get(getRandomIndex());
        }

        @Override
        public Component getFirstComponent(Container aContainer) {
            return comps.get(0);
        }

        @Override
        public Component getLastComponent(Container aContainer) {
            return comps.get(comps.size() - 1);
        }

        @Override
        public Component getDefaultComponent(Container aContainer) {
            return comps.get(0);
        }

        private int getRandomIndex() {
            Random random = new Random();
            return random.nextInt(comps.size());
        }
    }
}