Java 焦点遍历以跳过非焦点字段

Java 焦点遍历以跳过非焦点字段,java,netbeans,focus,Java,Netbeans,Focus,我在屏幕上有许多文本字段(比代码显示的要多) 在某个条件下(即用户在屏幕上标记复选框),我希望从焦点中删除txtPhone2和txtPhone2Text。但是,如果我在onClick事件中显式地说将这两个字段设置为Focusable false,那么当我在字段间切换时,我的光标只是停留在txtPhone1Text,而不会转到Fax1字段,跳过我设置为non Focusable的字段 想知道我是否遗漏了什么。如有任何提示/建议,我们将不胜感激。如果有必要,我会使用NetBeans IDE。阅读上的

我在屏幕上有许多文本字段(比代码显示的要多)

在某个条件下(即用户在屏幕上标记复选框),我希望从焦点中删除txtPhone2和txtPhone2Text。但是,如果我在onClick事件中显式地说将这两个字段设置为Focusable false,那么当我在字段间切换时,我的光标只是停留在txtPhone1Text,而不会转到Fax1字段,跳过我设置为non Focusable的字段


想知道我是否遗漏了什么。如有任何提示/建议,我们将不胜感激。如果有必要,我会使用NetBeans IDE。

阅读上的Swing教程。它提供了一个如何创建自定义焦点遍历策略的示例。不幸的是,这个示例不是很完整,因为它也有与您的代码相同的问题,因为它总是假设一个组件能够有焦点

我修改了示例中的类,以确保组件是可聚焦的:

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

        int idx = order.indexOf(aComponent);

        for (int i = 0; i < order.size(); i++)
        {
            idx = (idx + 1) % order.size();
            Component next = order.get(idx);

            if (canBeFocusOwner(next)) return next;
        }

        return null;
    }

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

        for (int i = 0; i < order.size(); i++)
        {
            idx = (idx - 1);

            if (idx < 0)
            {
                idx = order.size() - 1;
            }

            Component previous = order.get(idx);

            if (canBeFocusOwner(previous)) return previous;
        }

        return null;
    }

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

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

        Component c = order.lastElement();

        if (canBeFocusOwner(c))
            return c;
        else
            return getComponentBefore(focusCycleRoot, c);
    }

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

        Component c = order.get(0);

        if (canBeFocusOwner(c))
            return c;
        else
            return getComponentAfter(focusCycleRoot, c);
    }

    private boolean canBeFocusOwner(Component c)
    {
        if (c.isEnabled() && c.isDisplayable() && c.isVisible() && c.isFocusable())
        {
            return true;
        }

        return false;
    }

}
公共静态类MyOwnFocusTraversalPolicy扩展了FocusTraversalPolicy
{
向量顺序;
公共政策(矢量顺序)
{
this.order=新向量(order.size());
this.order.addAll(订单);
}
公共组件getComponentAfter(容器焦点),
组件(组件)
{
//intidx=(order.indexOf(aComponent)+1)%order.size();
//退货订单.get(idx);
int idx=order.indexOf(一个组件);
对于(int i=0;i
阅读上的Swing教程。它提供了一个如何创建自定义焦点遍历策略的示例。不幸的是,这个示例不是很完整,因为它也有与您的代码相同的问题,因为它总是假设一个组件能够有焦点

我修改了示例中的类,以确保组件是可聚焦的:

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

        int idx = order.indexOf(aComponent);

        for (int i = 0; i < order.size(); i++)
        {
            idx = (idx + 1) % order.size();
            Component next = order.get(idx);

            if (canBeFocusOwner(next)) return next;
        }

        return null;
    }

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

        for (int i = 0; i < order.size(); i++)
        {
            idx = (idx - 1);

            if (idx < 0)
            {
                idx = order.size() - 1;
            }

            Component previous = order.get(idx);

            if (canBeFocusOwner(previous)) return previous;
        }

        return null;
    }

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

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

        Component c = order.lastElement();

        if (canBeFocusOwner(c))
            return c;
        else
            return getComponentBefore(focusCycleRoot, c);
    }

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

        Component c = order.get(0);

        if (canBeFocusOwner(c))
            return c;
        else
            return getComponentAfter(focusCycleRoot, c);
    }

    private boolean canBeFocusOwner(Component c)
    {
        if (c.isEnabled() && c.isDisplayable() && c.isVisible() && c.isFocusable())
        {
            return true;
        }

        return false;
    }

}
公共静态类MyOwnFocusTraversalPolicy扩展了FocusTraversalPolicy
{
向量顺序;
公共政策(矢量顺序)
{
this.order=新向量(order.size());
this.order.addAll(订单);
}
公共组件getComponentAfter(容器焦点),
组件(组件)
{
//intidx=(order.indexOf(aComponent)+1)%order.size();
//退货订单.get(idx);
int idx=order.indexOf(一个组件);
对于(int i=0;i