gpt4 book ai didi

Java Swing FocusTraversalPolicy 问题

转载 作者:行者123 更新时间:2023-11-29 06:36:13 24 4
gpt4 key购买 nike

我目前在实现 FocusTraversalPolicy 时遇到问题。

我希望 Tab/Shift+Tab 键盘快捷键允许上下/左右导航。这将允许在填写表单时进行更简单的导航。

该策略应该只影响我的 JFramemainPanel 中的所有元素。

我已经使用以下类实现了政策:

public class DefaultViewFocusTraversalPolicy
extends FocusTraversalPolicy
{
ArrayList<Component> order;

public DefaultViewFocusTraversalPolicy(ArrayList<Component> order)
{
this.order = order;
}

@Override
public Component getComponentAfter(Container aContainer, Component aComponent)
{
int index = (order.indexOf(aComponent) + 1) % order.size();
Component after = order.get(index);
while (index < order.size() && !(after.isEnabled() && after.isVisible()))
{
index++;
after = order.get(index);
}
return after;
}

@Override
public Component getComponentBefore(Container aContainer, Component aComponent)
{
int index = order.indexOf(aComponent) - 1;
if (index < 0)
{
index = order.size() - 1;
}
Component before = order.get(index);
while (index >= 0 && !(before.isEnabled() && before.isVisible()))
{
index--;
before = order.get(index);
}
return before;
}

@Override
public Component getFirstComponent(Container aContainer)
{
int index = 0;
Component first = order.get(index);
while (index < order.size() && !(first.isEnabled() && first.isVisible()))
{
index++;
first = order.get(index);
}
return first;
}

@Override
public Component getLastComponent(Container aContainer)
{
int index = order.size() - 1;
Component last = order.get(index);
while (index >= 0 && !(last.isEnabled() && last.isVisible()))
{
index--;
last = order.get(index);
}
return last;
}

@Override
public Component getDefaultComponent(Container aContainer)
{
return getFirstComponent(aContainer);
}
}

然后我在 View 的构造函数中使用以下内容实例化该类(例如 main JFrame):

ArrayList<Component> order = new ArrayList<>();
order.add(this.ecmID);
order.add(this.modeID);
// ...
DefaultViewFocusTraversalPolicy policy =
new DefaultViewFocusTraversalPolicy(order);
this.mainPanel.setFocusTraversalPolicy(policy);

但是,当我尝试通过 Tab 键浏览元素时,没有任何改变,之前的策略仍然有效。我已经尝试过 Java 教程:link

如有任何帮助,我们将不胜感激。

最佳答案

我不确定你为什么要为你的情况扩展 FocusTraversalPolicy 而默认的 FocusTraversalPolicy 应该为你完成这项工作。

但是,您需要设置this.mainPanel.setFocusCycleRoot(true):设置此Container是否为焦点遍历循环的根。一旦焦点进入遍历循环,通常它不能通过焦点遍历离开它,除非按下向上或向下循环键之一。正常遍历仅限于此容器,以及此容器的所有非劣质焦点循环根的后代。

您可以查看 ContainerOrderFocusTraversalPolicy :

  1. 根据Container.getComponents()返回的顺序确定遍历顺序
  2. 从特定的焦点循环根开始,策略对组件层次结构进行预排序遍历。

它有一个很好的功能:boolean accept(Component aComponent) :确定 Component 作为新的焦点所有者是否是可接受的选择。只需通过扩展此类来覆盖此函数,使用您不想关注 Container 的相应组件列表。 无需重写所有函数并实现它们。

关于Java Swing FocusTraversalPolicy 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20200589/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com