java swing 自定义_自定义FocusTraversalPolicy类Java Swing

本文档介绍如何在Java Swing应用程序中创建一个自定义的FocusTraversalPolicy类,以定制Tab键的导航顺序。作者创建了一个名为CustomizedTabOrderPolicy的类,扩展了DefaultFocusTraversalPolicy,并重写了相关方法。然而,遇到的问题是,尽管没有编译或运行错误,但自定义的Tab顺序并未在实际应用中生效。作者在寻找解决方案,希望能使JPanel使用自定义的FocusTraversalPolicy。
摘要由CSDN通过智能技术生成

我正在为应用程序中的多个Panel设置新的Tab键顺序 . 我想创建一个新类,它允许我以与不推荐使用的setNextFocusableComponent方法相同的方式处理排序 . 我正在创建一个扩展DefaultTreversalPolicyClass的类,并重载getComponentBefore和getComponentAfter方法 . 在面板本身我希望实现就像创建一个新的自定义类(我称之为CustomizedTabOrderPolicy),然后添加我想要指定Tab键顺序的组件一样简单 . 我通过CustomizedTabOrderPolicy类上的便捷方法执行此操作,该类允许我将要为其指定Tab键顺序“链接”的组件添加到Hashtable,然后创建hastable的副本,其中键和值被切换 . 然后,我使用这些哈希表在两个组件之间 Build 前向和后向Tab键顺序“链接” .

以下是我的自定义类:

import java.awt.Component;

import java.awt.Container;

import java.awt.DefaultFocusTraversalPolicy;

import java.util.Hashtable;

public class CustomizedTabOrderPolicy extends DefaultFocusTraversalPolicy {

private Hashtable exceptionsMap = new Hashtable();

private Hashtable excpetionsMapReflection = new Hashtable();

private Component defaultComponent;

private Component firstComponent;

private Component lastComponent;

public CustomizedTabOrderPolicy() {

}

@Override

public Component getComponentAfter(Container container, Component component) {

java.awt.Toolkit.getDefaultToolkit().beep();

if (exceptionsMap.containsKey(component)) {

return exceptionsMap.get(component);

} else {

return super.getComponentAfter(container, component);

}

}

@Override

public Component getComponentBefore(Container container, Component component) {

if (exceptionsMap.containsValue(component)) {

return excpetionsMapReflection.get(component);

} else {

return super.getComponentBefore(container, component);

}

}

@Override

public Component getDefaultComponent(Container container) {

if (this.defaultComponent != null) {

return this.defaultComponent;

}

return super.getDefaultComponent(container);

}

@Override

public Component getFirstComponent(Container container) {

if (this.firstComponent != null) {

return this.firstComponent;

}

return super.getFirstComponent(container);

}

@Override

public Component getLastComponent(Container container) {

if (this.lastComponent != null) {

return this.lastComponent;

}

return super.getLastComponent(container);

}

public void addNewException(Component origin, Component destination) {

exceptionsMap.put(origin, destination);

excpetionsMapReflection.put(destination, origin);

}

public void setDefaultComponent(Component defaultComponent) {

this.defaultComponent = defaultComponent;

}

public void setLastComponent(Component lastComponent) {

this.lastComponent = lastComponent;

}

public void setFirstComponent(Component firstComponent) {

this.firstComponent = firstComponent;

}

}

为了实现这一点,我在我的JPanel上使用以下内容:

CustomizedTabOrderPolicy customPolicy = new CustomizedTabOrderPolicy();

customPolicy.addNewException(, );

customPolicy.addNewException(, );

customPolicy.addNewException(, );

this.setFocusTraversalPolicy(customPolicy);

我没有得到任何编译器或运行时错误,但似乎JPanel根本没有使用我的CustomTabOrderPolicy . 当我在getComponentBefore和getComponentAfter方法中插入断点时,它们永远不会被触发 . 我很擅长使用Focus Traversal政策,所以我想知道我在这里缺少什么......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值