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