UI delegate的问题

lilly317 2002-06-06 06:24:53
请教:
新创建的一个组件,在其构造函数中调用
updateUI来创建自己的UI delegate,函数如下
public void updateUI()
{
setUI(UIManager.getUI(this));
}

UIManager中getUI函数的实现如下
public static ComponentUI getUI(JComponent target)
{
...
Component ui=null;
...
if(ui==null)
ui=getDefaults().getUI(target);
}

显然,调用了UIDefaults的getUI函数,在UIDefaults中该函数实现如下:
public ComponenUI getUI(JComponent target)
{
ClassLoader uiClassLoader = target.getClass().getClassLoader();
Class uiClass=getUIClass(target.getUIClassID(),uiClassLoader);

Object uiObject = null;
if(uiClass==null)
{
getUIError("no componentUI class for:"+target);
}
else
{
try
{
Method m = (Method)get(uiClass);
if(m==null)
{
Class acClass=javax.swing.JComponent.class;
m=uiClass.getMethod("createUI",new Class[] {acClass});
put(uiClass,m);
}
uiObject=m.invoke(null,new Object[] {target});
}
catch(NoSuchMethodException e)
{
getUIError("static createUI() method not found in"+uiClass);
}
catch(Exception e1)
{
getUIError("createUI() failed for"+target+""+e1);
}
}

return (ComponentUI)uiObject;
}

问题:上面具体是怎么利用反射功能创建UI delegate的?另外,据我的了解,应当是根据当前的LookAndFeel创建不同的UI delegate,但是从这段代码中却看不出来。
...全文
61 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lilly317 2002-06-17
  • 打赏
  • 举报
回复
谢谢!!!
fightboy 2002-06-14
  • 打赏
  • 举报
回复
例如JButton对应的就是ButtonUI
而在WindowsLookAndFeel类里边定义如下:
/**
* Initialize the uiClassID to BasicComponentUI mapping.
* The JComponent classes define their own uiClassID constants
* (see AbstractComponent.getUIClassID). This table must
* map those constants to a BasicComponentUI class of the
* appropriate type.
*
* @see BasicLookAndFeel#getDefaults
*/
protected void initClassDefaults(UIDefaults table)
{
super.initClassDefaults(table);


String windowsPackageName = "com.sun.java.swing.plaf.windows.";
Object[] uiDefaults = {
"ButtonUI", windowsPackageName + "WindowsButtonUI",
"CheckBoxUI", windowsPackageName + "WindowsCheckBoxUI",
"RadioButtonUI", windowsPackageName + "WindowsRadioButtonUI",
"ToggleButtonUI", windowsPackageName + "WindowsToggleButtonUI",

等等,也就是说默认的ButtonUI在windows下对应com.sun.java.swing.plaf.windows.WindowsButtonUI类,


在你上边拷贝的这一段程序中:
“ if(ui==null)
ui=getDefaults().getUI(target);
}

显然,调用了UIDefaults的getUI函数,”

这里你没有说为什么显然。
而lookandfeel的获取就是在你这个显然里边
UiManager的getDefault就是返回当前程序中默认的L&F

所以整个流程是
组件的updateUi->UiManager的getDefault得到对应的lookandfeel的UiDefault->根据UIDefault的table表得到对应的平台的LookAndFeel的classID->在通过UIdefault中的反射生成对应的UI对象
fightboy 2002-06-13
  • 打赏
  • 举报
回复
每一个JComponent都有一个UIClassID和它对应。
这个UIClassID就是对应的....

太晚了,必须走人了
明天在说吧
daehappy 2002-06-13
  • 打赏
  • 举报
回复
up!关注!
lilly317 2002-06-10
  • 打赏
  • 举报
回复
麻烦再说详细一点!谢谢!!!
fightboy 2002-06-06
  • 打赏
  • 举报
回复
注意
target.getUIClassID()
这句话
wdydt163 2002-06-06
  • 打赏
  • 举报
回复
if(ui==null),这行,你确定ui就一定是null吗?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧