XPS规范

XPS(Xml Parser for Swing)用来根据xml动态构建一个swing中的组件。
根据sun发布的java beans规范( http://www.oracle.com/technetwork/java/javase/documentation/spec-136004.html)
JComponent是一个自描述的标准bean,构造一个JComponent无非就是设置JComponent的属性。构造jcomponent时会用到的属性设置分一下几种,
下面介绍如何通过xml来设置它们
1.普通属性:当一个类中含有形如:PropertyType getPropertyName();并且同时存在 void setPropertyName(PropertyName prop);时,称
    该类存在一个名为propertyName(注意名字为camel风格,即第一个单词首字母大写,其余单词首字母大写)
    且类型为为集合类型PropertyType的可读可写的属性。当二者仅存在其中之一时,称为只读或者只写属性。
    入对于一个JButton,在XPS中,你可以通过入如下的方式设置其显示的文本
    <JButton>
        <text>button</text>
        <size>
            <Dimension>
                <width>50<width>
                <height>18</height>
            </Dimension>
        </size>
    </JButton>
    相应的XPS构造时会寻找JButton中的一个名为setText的方法,找到之后尝试将解析到的文本转换为setText方法期待的参数类型,
    如果没有找到方法或者不能通过简单的文本解析构造参数,则XPS会抛出异常,并终止解析过程。同样对于内嵌的dimension属性的设置也是如此
    此过程等同于如下java代码
    JButton btn = new JButton();
    btn.setText("button");
    Dimension size = new Dimension();
    size.setWidth(50);
    size.setHeight(18);
    btn.setSize(size);
    值得说明的是对于可以有文本转换而来的属性,即String,int ,float,double,long,short,byte,以及所有定义了以String为唯一的参数,以自身类型的一个实例为返回值的静态方法的类型,
    都可以通过xml 的attribute来指定
    如:
    <JButton text="button" foreground="#ff1010" width="12.0"/>
    注意在Color中有静态方法:static Color getColor( String v)因此color属性也可以通过attribute指定
2.事件监听器,当类中存在形如:addSomeEventListener(Listener ls);时,则该类允许注册someEvent(即第一个单词首字母大写,其余单词首字母大写)监听器
    例如为button实例添加一个action listener用java代码实现为:
    JButton btn = new JButton();
    ActionListener al;
    //some initialize for action listener;
    btn.adActionListener(al);
    等价的xml方式
    <JButton>
        <actionListener>
            <ImplementedActionListener/>
        <actionListener>
    <JButton>
    对于这个问题请求意见!!!!这种形式会引起误解,对于标准的swing包中的组件不会出现问题,可是自己扩展的就难说了,比如自己扩展了一个JComponent
    其中定义了一个方法为setActionListener(ActionListener ac);虽然程序可能正确运行,但可以肯定这不是预期的结果,如果swing中的事件监听可以向html中那样指定就好了
    可是swing中的事件监听器五花八门,没有通用的格式,构架如此,改不了。
    Swing设计之初可能没有考虑这些
3.添加子组件:对于这个属性设置,JComponent没有符合默认的java beans规范。
    但是JComponent并不符合这个规范,通过代码向一个JComponent中增加子组件时会这样:
    JPanel panel = new JPanel();
    JButton btn = new JButton();
    btn.setText("text");
    panel.add(btn);
    在XPS中,可以通过如下方式构造一个等价的panel:
    <JPanel>
        <items>
            <JButton text="text"/>
        <items>
    </JPanel>
    。。。。
    。。
    。。。
    待补充。。。
这个解析器还在开发之中,有兴趣的可以一起,我最终的目标是想像oracle 的Scene Builder for javafx一样开发一个Swing Builder for swing(趁现在人家还没有发布swing的相关版本).

你可能感兴趣的:(XPS规范)