我有一个包含许多小组件的大组件,那么将使用什么来确定这些小组件的制表符顺序?

还有,有没有办法为JComponent设置FocusTraversalPolicy

最佳答案

还有,有没有办法为FocusTraversalPolicy设置JComponent


是。看看How to Use the Focus SubsystemCustomizing Focus Traversal部分提供了完整的示例FocusTraversalDemo,确切解释了如何执行此操作。它基本上创建了一个扩展FocusTraversalPolicy的类,在其中它重写了一些方法来确定组件遍历的顺序



更新

这是一个使用RandomFocusTraversalPolicy的示例,该名称恰如其名。遍历是随机的。



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

08-05 18:41