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

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


猜你喜欢

转载自blog.csdn.net/kzcming/article/details/80006755