// Java Document
个人认为这东东现在还不是太好,最重要的是不为对组件的位置排版!这也不奇怪人家才刚出不久吗!希望它不久能做到这一点!
1.??class="Apple-converted-space">?Synth概述
Synth是Sun提供的一种新的Look And Feel,与以往的Look And Feel不同,这是个通过配置文件进行定义的,插入式的Look And Feel。在不修改代码的情况下,用户可以仅通过修改配置文件,即可对控件的字体,颜色等属性进行修改。
2.???Synth配置文件
a)????????说明:Synth配置文件是一个XML文件,她是整个Synth配置的关键,而要掌握Synth,最主要的就是要熟悉该文件的DTD,因为他规定了什么可以配置,而什么是不可配置的。
3.???Synth元素
a)????????说明:synth元素是整个Synth配置文件的根元素,可以在该元素下通过font,color,imagePainter等标签,直接定义全局可用的风格,然后在某个style或者state内部,通过他们的子font,color标记上的idref属性,即可引用这些全局定义好的属性。。
b)????????DTD:
<!ELEMENT synth ((%beansPersistance;) | style | bind | font | color |
?????????????????imagePainter | imageIcon)*>
4.???Style元素
a)????????说明:style标签的用途就是把font,color等标签归到一起,作为一个完整的风格,她需要通过后续的bind标签,来绑定到具体的控件上。另外clone属性提供了一种继承机制,通过该属性你可以从某个已定义的style当中把内容继承过来,然后修改某个需要改变的部分即可。
b)????????DTD:
<!ELEMENT style (property | defaultsProperty | state | font | painter | imagePainter|
?????????????????backgroundImage | opaque | (%beansPersistance;) | imageIcon)*>
c)????????例子:
<style id="button">
<opaque value="true"/>
<insets top="4" left="4" right="4" bottom="4"/>
<font name="Dialog" size="12"/>
</style>
?5.???State元素
a)????????说明:State标签用于指定控件在某个特定状态时的风格。state标签中的value值在SynthConstants类中定义。
b)????????DTD:
<!ELEMENT state (color | font | painter | imagePainter | (%beansPersistance;))*>
c)????????例子:
<state value="SELECTED and PRESSED" id="one">
<color value="RED" type="BACKGROUND"/>
</state>
6.???Font元素
a)????????说明:定义某种字体风格。
b)????????例子:<font name="DIALOG" size="12" style="ITALIC"/>
7.???Color元素:
a)????????说明:定义某种颜色。
b)????????例子:<color value="RED" type="BACKGROUND"/>
8.???Property元素:
a)????????说明:通过键值对的方式定义某些控件特定的属性,属性值将存入类SynthStyle类中,这样做的一个好处就是不用为每个特定属性都定义一个标签,而且以后要扩展也比较方便。可以设置的控件属性,参考最后的表格。
b)????????DTD:<!ELEMENT property EMPTY>
c)????????例子:
<property key="ScrollBar.allowsAbsolutePositioning" type="boolean" value="false"/>
9.???DefaultsProperty元素
a)????????说明:将特定于控件的属性值存入类UIDefaults当中,然后由SynthLookAndFeel传入UIManager当中。通过UIManager.get()方法可以获取到该值。
b)????????DTD:<!ELEMENT defaultsProperty EMPTY>
c)????????例子:
<object class="javax.swing.plaf.ColorUIResource" id="color">
????<int>255</int>
????<int>0</int>
????<int>0</int>
</object>
<defaultsProperty key="Table.focusCellForeground" type="idref" value="color"/>
10.GraphicsUtils元素
a)????????说明:用于定义当前Style所使用的SynthGraphicsUtils实例。
b)????????DTD:<!ELEMENT graphicsUtils EMPTY>
c)????????例子:
<object class="CustomGraphicsUtils" id="graphics"/>
<graphicsUtils idref="graphics"/>
11.Insets元素:
a)????????说明:定义某种间距。
b)????????例子:<insets top="1" bottom="2" left="3"/>
12.Bind元素
a)????????说明:将属性与一类或者某一特定的控件进行绑定。当type的值为region时,她处理的是一系列的控件。当需要处理某个特定的组件时,需要把type设定为name,然后在组件上调用setName()方法设定名字,这样在程序执行时Synth,将会根据组件的getName()的返回值进行匹配。Key部分是使用正则表达式的方式进行匹配。当一个控件有多个style可匹配,那么这些style将被合并,如果style之间有同名部分,则后定义的style将覆盖之前定义的style。
b)????????DTD:<!ELEMENT bind EMPTY>
c)????????例子:
<style id="b">
??<font name="DIALOG" size="12" style="BOLD"/>
</style>
<bind style="b" type="region" key="button"/>
13.Painter元素
a)????????说明:为当前的Style或者State定义一个用于绘画文本的SynthPainter实例。
b)????????DTD:<!ELEMENT painter EMPTY>
c)????????例子:
<object class="MyPainter" id="MyPainter"/>
<painter idref="MyPainter"/>
14.ImagePainter元素
a)????????说明:为当前的Style或者State定义一个用于绘画图形的SynthPainter实例。可以用该属性来绘制控件的背景。
b)????????DTD:<!ELEMENT imagePainter EMPTY>
c)????????例子:
<imagePainter path="bg.jpg" method="panelBackground" sourceInsets="2 2 2 2"
paintCenter="true"/>
15.ImageIcon元素
a)????????说明:为支持Icon属性的控件绑定一个图标。
b)????????例子:
<imageIcon id="icon" path="resources/myImage.png"/>
<property key="RadioButton.icon" value="icon"/>
16.Opaque元素
a)????????说明:用于设置一个控件的Opaque属性。
b)????????例子:<opaque value="FALSE">
17.BeansPersistence属性
a)????????说明:该属性可以为其他标签(imagePainter等)引入一些自定义的类。
18.完整的例子:
a)????????配置文件:
<synth>
<style id="emulator">
<imagePainter path="images/phone.png" method="panelBackground"???sourceInsets="2 2 2 2" paintCenter="true"/>
</style>
<bind style="emulator" type="name" key="Emulator.*"/>
</synth>
b)????????Java代码:
public class Emulator extends JPanel {
?????public static void main(String[] args) throws Exception {
?????????Runnable runner = new Runnable() {
??????????????public void run() {
???????????????????try {
???????????????????????SynthLookAndFeel synth = new SynthLookAndFeel();
???????????????????????Class aClass = Emulator.class;
???????????????????????InputStream is = aClass.getResourceAsStream("demo.xml");
???????????????????????synth.load(is, aClass);
???????????????????????UIManager.addAuxiliaryLookAndFeel(synth);
???????????????????????JFrame frame = new JFrame("SIP Client");
???????????????????????frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
???????????????????????frame.setLayout(new BorderLayout());
???????????????????????Emulator emulator = new Emulator();
???????????????????????emulator.setName("Emulator");
???????????????????????frame.add(emulator, BorderLayout.CENTER);
???????????????????????frame.setSize(360, 674);
???????????????????????frame.setResizable(false);
???????????????????????frame.setVisible(true);
???????????????????} catch (Exception e) {
???????????????????????e.printStackTrace();
???????????????????}
??????????????}
?????????};
?????????EventQueue.invokeLater(runner);
?????}
?????public Emulator() {}
}
c)????????说明:文件的路径,及下文当中路径相关的操作,都是相对于load()方法中的class参数的位置。当使用SynthLookAndFeel时,需要为每个控件都指定风格,这显然是很累的,一个解决办法就是,不调用UIManager.setLookAndFeel(laf),而是使用UIManager.addAuxiliaryLookAndFeel(laf),即将Synth作为扩展的LookAndFell,这就能继续使用默认的LookAndFeel和定制的SynthLookAndFeel。