SynthDTD

1.   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,p_w_picpathPainter等標籤,直接定義全局可用的風格,然後在某個style或者state內部,通過他們的子font,color標記上的idref屬性,即可引用這些全局定義好的屬性。。

b)        DTD:
<!ELEMENT synth ((%beansPersistance;) | style | bind | font | color | p_w_picpathPainter | p_w_picpathIcon)*>

4.   Style元素

a)        說明:style標籤的用途就是把font,color等標籤歸到一起,作爲一個完整的風格,她需要通過後續的bind標籤,來綁定到具體的控件上。另外clone屬性提供了一種繼承機制,通過該屬性你可以從某個已定義的style當中把內容繼承過來,然後修改某個需要改變的部分即可。

b)        DTD:
<!ELEMENT style (property | defaultsProperty | state | font | painter | p_w_picpathPainter | backgroundImage | opaque | (%beansPersistance;) | p_w_picpathIcon)*>

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 | p_w_picpathPainter | (%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 p_w_picpathPainter EMPTY>
c)        例子:
<p_w_picpathPainter path="bg.jpg" method="panelBackground" sourceInsets="2 2 2 2"
paintCenter="true"/>

15.ImageIcon元素

a)        說明:爲支持Icon屬性的控件綁定一個圖標。
b)        例子:
<p_w_picpathIcon id="icon" path="resources/myImage.png"/>
<property key="RadioButton.icon" value="icon"/>

16.Opaque元素

a)        說明:用於設置一個控件的Opaque屬性。
b)        例子:<opaque value="FALSE">

17.BeansPersistence屬性

a)        說明:該屬性可以爲其他標籤(p_w_picpathPainter等)引入一些自定義的類。

18.完整的例子:

a)        配置文件:

<synth><style id="emulator"><p_w_picpathPainter path="p_w_picpaths/phone.png" method="panelBackground"   sourceInsets="2 2 2 2" paintCenter="true"/></style><bind style="emulator" type="name" key="Emulator.*"/></synth>

b)        Java代碼:

複製代碼
publicclass Emulator extends JPanel {     publicstaticvoid main(String[] args) throws Exception {         Runnable runner = new Runnable() {              publicvoid 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。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章