TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
SYNTH Synth是J2SE5.0里新引入的Swing组件。 Synth是用户自定义的界面工具(一般被称作skinnable)。用户定义的skin(你叫它皮肤也好)是由一个xml文件控制。这样我们就不必再依靠UIManager去编写属性表来控制界面外观。我们只需要到下面的xml文件中调整部件定义就可以了,基本上省去了代码编写的工作。
下面是一个简单的例子, --来自sun java技术论坛
- import java.awt.BorderLayout;
- import java.awt.EventQueue;
- import java.io.InputStream;
- import java.text.ParseException;
- import javax.swing.JButton;
- import javax.swing.JLabel;
- import javax.swing.JFrame;
- import static javax.swing.JFrame.*;
- import javax.swing.UIManager;
- import javax.swing.plaf.synth.SynthLookAndFeel;
- public class HelloSynth {
- public static void main(String args[]) {
- Runnable runner = new Runnable() {
- public void run() {
- SynthLookAndFeel synth = new SynthLookAndFeel();
- try {
- Class aClass = HelloSynth.class;
- InputStream is =
- aClass.getResourceAsStream("synth.xml");
- if (is == null) {
- System.err.println("Missing configuration file");
- System.exit(-1);
- }
- synth.load(is, aClass);
- } catch (ParseException e) {
- System.err.println("Bad configuration file");
- System.exit(-2);
- }
- try {
- UIManager.setLookAndFeel(synth);
- } catch
- (javax.swing.UnsupportedLookAndFeelException e) {
- System.err.println("Cannot change to Synth");
- System.exit(-3);
- }
- JFrame frame = new JFrame("First");
- frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
- JLabel label = new JLabel("Hello, Synth");
- label.setHorizontalAlignment(JLabel.CENTER);
- frame.add(label);
- frame.setSize(300, 100);
- frame.setVisible(true);
- }
- };
- EventQueue.invokeLater(runner);
- }
- }
复制代码
HelloSynth 创建了一个新的SynthLookAndFeel的对象并用load办法读取xml文件:synth.xml。
注意synth.load(InputStream,Class< ?>) 的两个参数,InputStream不用进一步讲解,就是读取xml文件的数据流,Class是数据来源类,这里当然是HelloSynth的instance: aClass.
下面是synth.xml
<synth>
<style id="label">
<font name="Monospaced" size="18" style="BOLD ITALIC"/>
<opaque value="true"/>
<state>
<color value="PINK" type="FOREGROUND"/>
<color value="YELLOW" type="BACKGROUND"/>
</state>
</style>
<bind style="label" type="region" key="Label"/>
</synth>
HelloSynth读取synth.xml,创建一个JLabel,然后把它输出到屏幕。可以看到JLabel的颜色,字体都是通过xml文件来设置的。
具体如下:
18-point bold-italic font,
opaque,
foreground color:pink (text color),
background color:yellow
输出:
下面是另一个 xml的例子:
<synth>
<style id="label">
<opaque value="true"/>
<font name="Monospaced" size="18" style="BOLD"/>
<state>
<color value="RED" type="FOREGROUND"/>
<color value="BLACK" type="BACKGROUND"/>
</state>
</style>
<bind style="label" type="region" key="Label"/>
</synth>
输出:
关于Synth所应用到的xml的格式和语法 请参考:
http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/plaf/synth/doc-files/synthFileFormat.HTML
关于Swing组件的属性参数 请参考:
http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/plaf/synth/doc-files/componentProperties.html
参考链接里面的例子
甚至组件的状态--一般以往用到actionListener的地方, 图形icon的路径,对象参数的嵌入(主要是Painter的使用)等等都可以
用xml文件来控制从而减少繁冗的代码编写。
function TempSave(ElementID)
{
CommentsPersistDiv.setAttribute("CommentContent",document.getElementById(ElementID).value);
CommentsPersistDiv.save("CommentXMLStore");
}
function Restore(ElementID)
{
CommentsPersistDiv.load("CommentXMLStore");
document.getElementById(ElementID).value=CommentsPersistDiv.getAttribute("CommentContent");
}
源码下载:http://file.javaxxz.com/2014/10/1/220809859.zip |
|