通过父级组件,通过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;
}
}