在JTabbedPane中的选项卡上设置个性化FocusTraversalPolicy

时间:2016-02-19 14:52:06

标签: java focus jtabbedpane

在解决了背景图片的问题之后,我真的不想尝试改变焦点政策。

我创建了类并覆盖了这样的方法:

package tab;

import java.awt.Component;
import java.awt.Container;
import java.awt.FocusTraversalPolicy;
import java.util.Vector;

public class MyOFocusTraversalPolicy extends FocusTraversalPolicy{

    Vector<Component> order;

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

    @Override
    public Component getComponentAfter(Container focusCycleRoot,
            Component aComponent) {
        int idx = (order.indexOf(aComponent) + 1);// % order.size();
        System.out.println("Estoy en el getComponentAfter, numero: "+idx);
        System.out.println("El tamaño del vector es de:"+order.size());
        return order.get(idx);
    }

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

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

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

    @Override
    public Component getFirstComponent(Container focusCycleRoot) {
        return order.get(1);
    }

}

我使用选项卡中的所有组件创建向量,并声明一个新的MyofocusTraversalPolicy对象,如下所示:

Vector<Component> order = new Vector<Component>(14);
            order.add(rBtnHombre);
            order.add(rBtnMujer);
            order.add(spinEdad);
            order.add(slider);
            order.add(txtUser);
            order.add(txtPass);
            order.add(txtConfirmPass);
            order.add(txtNombre);
            order.add(txtApellidos);
            order.add(cBoxProvincias);
            order.add(cBoxTipoCalle);
            order.add(txtDireccion);
            order.add(txtCP);
            order.add(txtMail);

            newPolicyDatos = new MyOFocusTraversalPolicy(order);
            datos.setFocusTraversalPolicy(newPolicyDatos);

然而它没有效果。

问题可能是因为“datos”是属于JTabbedPane的三个选项卡之一,对于其他任何我没有想法的选项卡,我找不到关于选项卡上的FocusTraversalPolicy的具体信息。

我在getComponentAfter中设置了一个打印,并且在通过组件进行制表时没有显示

希望有人以前试过这个并且可以帮我一臂之力

1 个答案:

答案 0 :(得分:0)

我知道这已经过时了,但我最近一直在尝试类似的东西,并想知道为什么导线不会像我设置的那样起作用。

对我来说遗漏的是:

myJTabbedPane.add(outerMostJPanel);
outerMostJPanel.setFocusCycleRoot(true); // magic-line
outerMostJPanel.setFocusTraversalPolicy(new MyFocusTraversalPolcy(...));

希望这有帮助。