java,swing 通过名称,通过组件类型查找下级组件

1 篇文章 0 订阅

通过父级组件,通过Container类的getComponents()方法获得所有组件,

然后通过获得名称进行名称判断,如果当前对象没找到,继续递归调用本方法,继续查找下级,

查api发现只有Container类中有一个通过坐标查找components下级组件的方法findComponentAt(int x, int y)

很不方便,

需求:为了将监听器和组件的实体类分开,通过继承的方式重写ActionListener和KeyListener,需要在继承类中获得对应的组件

解决1:在继承类中创建带有顶级对象的有参构造,然后在实体类创建监听器时,使用此有参构造创建对象

解决2:获得具体的执行组件,比如:一个记事本类型,现在想要打开获得jtextArea的内容,需要获得对应的组件,通过给组件设置名称,然后通过这个方法,就可以查找到对应的组件

解决3:通过组件类型来查找组件,原本想使用instanceof,发现泛型无法放在右边,编译时无法替换,找到一种替换方式,通过比较类的字节码对象(class)是否相等

package com.swing.util;

import java.awt.Component;
import java.awt.Container;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.JButton;

public class FindComponent{
	
	//private static Component result = null;
	//使用全局变量,result 没有清空重置为null,FindComponent 类,第一次强转后会记住对应的类型,第二次转其他类型会报错
	
	//TODO 有时会出现一直返回null,因为没调用完
	/**
	 * 通过组件名,从父级组件沿着递归找到此名字的组件
	 * 
	 * @param c		父级组件
	 * @param name	设置的组件名称
	 * @return
	 */
	public static Component searchComponentByName(Container c,String name){//父级组件,设置的组件名称
		Component result = null;
		Component[] components = c.getComponents();
		if( null == result &&  null != components && components.length > 0){
			for (Component component : components) {
				String name2 = component.getName();
				if(name2 != null && name2.equals(name)){
					result = component;
					return result;
				}else if(null == result){//递归调用所有下级组件列表
					if(component instanceof Container)
					result = searchComponentByName((Container)component, name);
				}
			}
		}
		return result;
		
	}
	
	/**
	 * 不使用instanceof 判断是否是同一种类型,
	 * 判断目标类型和源类型的字节码对象(Class)是否是同一种类型
	 * 通过class类的toString 方法,判断打印出来的类型是否相等,或者直接判断
	 * 
	 * @param c
	 * @param cla
	 * @return
	 */
	public static <T extends Component> Component searchComponentByClass(Container c,Class<T> t){//泛型方法
		Component result = null;
		Component[] components = c.getComponents();
		if( null == result &&  null != components && components.length > 0){
			for (Component component : components) {
				//if(component instanceof t){//发现泛型无法作为instanceof右边的对象,无法在运行时将泛型替换为对应的对象
				if(component.getClass().equals(t)){
					//if(component.getClass().toString().equals(t.toString()))			和上一行代码效果相同
					result = component;
					return result;
				}else if(null == result){//递归调用所有下级组件列表
					if(component instanceof Container)
					result = searchComponentByClass((Container)component, t);
				}
			}
		}
		return result;
	}
	
	
	
}


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值