Synth概述

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代碼:

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