Swing Application Framework 簡單介紹(三)

01:18下午 一月 20, 2009 in category Swing by UndeadJ

先前在Swing Application Framework 簡單介紹(二)
中有提到,利用
ResourceMap可以幫助我們對元件做資源綁定的工作。

其實,ResourceMap也提供將.properties中的字串,注入到程式中的欄位(fields)。
       
方法如下:

首先,必須在Fields前面加上Annotation - @Resource,以表示這個Field的值可以利用.properties檔來取得。
       
@Resource String s;
       
這裡有個地方要注意,就是變數的名稱要和.properties中的key值一樣,不然會取不到值。
       
另外一個方法是直接指明要取得的key值,這樣做的話,變數的名稱就可以不用和.properties中的key值一樣
       
@Resource (key=s) String s;
       
定義好要注入的fields後,利用ResourceMap提供的injectFields(java.lang.Object target)方法就可以把所有fields的值一次賦予。
       
方法中的target,指的是擁有這些fields的物件。下面是一個例子:

       
package ResourceDemo;

import org.jdesktop.application.ApplicationContext;
import org.jdesktop.application.Resource;
import org.jdesktop.application.ResourceMap;
import org.jdesktop.application.SingleFrameApplication;

public class injectFieldsDemo2 extends SingleFrameApplication{
    
    
    @Resource Color color;
    @Resource String hello ;
    @Resource (key="Swing") String Swing;
    @Resource int[] numbers = new int[2];
    
    
    @Override
    protected void startup() {
        ApplicationContext ctx = getContext();
        ResourceMap resource = ctx.getResourceMap();
        
        resource.injectFields(this);
        System.out.println(color);
        System.out.println(hello);
        System.out.println(Swing);
        for(int i=0;i<numbers.length;i++){
            System.out.println(numbers[i]);
        }
    }

    public static void main(String[] arge){
        launch(injectFieldsDemo2.class,arge);
    }    
}
 
    .properties檔案內容如下:
       
    injectFieldsDemo2.hello = Hello!
    injectFieldsDemo2.color = 33,33,33
    Swing = I Love Swing!
    injectFieldsDemo2.numbers[0] = 99
    injectFieldsDemo2.numbers[1] = 66   
   
    
    ResourceMap類別也提供將.properties檔案中key的值,直接轉換成各種型態,以利在程式中使用      

  •     Boolean -> getBoolean(java.lang.String key)
  •     Integer -> getInteger(java.lang.String key)
  •     Float   -> getFloat(java.lang.String key)
  •     Double  -> getDouble(java.lang.String key)
  •     Long    -> getLong(java.lang.String key)
  •     Short   -> getShort(java.lang.String key)
  •     Byte    -> getByte(java.lang.String key)

實際上,這些方法也就是利用java.lang.Boolean, java.lang.Integer, java.lang.Float, java.lang.Double, java.lang.Long, java.lang.Short, java.lang.Byte下的轉換方法【parserXXX(java.lang.String string)】
   

ResourceMap利用ResourceConverter類別幫我們實作好了,所以可以直接把.properties檔案中key的值,轉換成各種型態
    
ResourceConverter類別主要功能就是提供String轉換成任意型態。
    
ResourceMap另外也提供了

  • getImageIcon(java.lang.String key)
  • getKeyCode(java.lang.String key),
  • getKeyStroke(java.lang.String key)
  • getIcon(java.lang.String key)

下面是個例子:

    
package ResourceDemo;

import java.awt.Color;
import java.awt.Font;
import javax.swing.JLabel;

import org.jdesktop.application.ApplicationContext;
import org.jdesktop.application.ResourceMap;
import org.jdesktop.application.SingleFrameApplication;

public class injectFieldsDemo3_Main extends SingleFrameApplication{

    protected void startup() {
        ApplicationContext ctx = getContext();
        ResourceMap resource = ctx.getResourceMap();
        
        String msg;
        Color color;
        Font font;   
        JLabel label;
        
        msg = resource.getString("msg");
        color = resource.getColor("color");
        font = resource.getFont("font");
        
        label = new JLabel(msg);
        label.setForeground(color);
        label.setFont(font);
        show(label);
    }
    
    public static void main(String[] args) {
        launch(injectFieldsDemo3_Main.class, args);
    }
}  

 


   .properties檔案內容如下:
       
    msg =  Hello World!
    font = Arial-BOLD-22
    color = #BB0000    
   
也可以利用.properties檔,來進行字串的格式化,只要事先在.properties檔內定義好一些想要的格式化類型,然後利用String.Format(String  format, Objece...  argues),就可以對某字串進行相對的格式化 。這樣一來,格式化字串就變的很方便。
       
下面是一個顯示不同日期格式的例子:
       
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.jdesktop.application.ApplicationContext;
import org.jdesktop.application.ResourceMap;
import org.jdesktop.application.SingleFrameApplication;


public class StringFormatDemo extends SingleFrameApplication{
    SimpleDateFormat df;
    String dateFormat;
    Calendar date;
    @Override
    protected void startup() {
        ApplicationContext ctx = getContext();
        ResourceMap resource = ctx.getResourceMap();
        Date now = new Date();
        df = new SimpleDateFormat();
        
        //日期輸出 - 版本一        
        dateFormat = resource.getString("版本一");
        df.applyPattern(dateFormat);
        System.out.println(df.format(now));

        //日期輸出 - 版本二
        dateFormat = resource.getString("版本二");
        df.applyPattern(dateFormat);
        System.out.println(df.format(now));     
    }
    
    public static void main(String[] args) {
        launch(StringFormatDemo.class, args);
    }
}

    .properties檔案內容如下:
    版本一 = 現在時間:  yyyy/MM/dd HH:mm:ss
    版本二 = 現在時間:  yyyy年M月d日 HH時mm分
       
或者在裡面定義好相關的數字轉換公式,直接拿來用
       
import org.jdesktop.application.ApplicationContext;
import org.jdesktop.application.ResourceMap;
import org.jdesktop.application.SingleFrameApplication;

public class UnitConversionDemo extends SingleFrameApplication{

    final float unit =1;

    @Override
    protected void startup() {
        ApplicationContext ctx = getContext();
        ResourceMap resource = ctx.getResourceMap();
        /*
         * 長度單位換算
         */

        System.out.println(unit+"英吋 = "+resource.getFloat("英吋轉公分")*unit+"公分");
        System.out.println(unit+"公分 = "+resource.getFloat("公分轉英吋")*unit+"英吋");
        System.out.println(unit+"英吋 = "+resource.getFloat("英吋轉毫米")*unit+"毫米");
        System.out.println(unit+"公尺 = "+resource.getFloat("公尺轉英呎")*unit+"英呎\n");
        
        /*
         * 面積單位換算
         */

        System.out.println(unit+"平方公尺 = "+resource.getFloat("平方公尺轉平方英呎")*unit+"平方英呎");
        System.out.println(unit+"平方公里 = "+resource.getFloat("平方公里轉平方英哩")*unit+"平方英哩");
        System.out.println(unit+"平方公分 = "+resource.getFloat("平方公分轉平方英吋")*unit+"平方英吋");
        System.out.println(unit+"平方英吋 = "+resource.getFloat("平方英吋轉平方公分")*unit+"平方公分\n");
    }
    
    public static void main(String[] args) {
        launch(UnitConversionDemo.class, args);
    }

}

 


.properties檔案內容如下:

#  度量單位轉換
#
#  長度
        
英吋轉公分 = 2.54
公分轉英吋 = 0.39
英吋轉毫米 = 25.40
毫米轉英吋 = 0.04
英呎轉公尺 = 0.31
公尺轉英呎 = 3.28
碼轉公尺 = 0.91
公尺轉碼 = 1.09
英哩轉公里 = 1.61
公里轉英哩 = 0.62


#  面積     
   
平方英吋轉平方公分 =6.451
平方���分轉平方英吋 = 0.15
平方英吋轉平方公尺 = 0.09
平方公尺轉平方��呎 =10.76
平方碼轉平方公尺 = 0.84
平方公尺轉平方碼 = 1.20
平方英哩轉平方公里 =      2.59
平方公里轉平方英哩=       0.39
英畝轉公頃 =              0.40
公頃轉英畝=               2.47

#  體積     

立方英吋轉立方公分=      16.39
立方公分轉立方英吋=       0.06
立方英呎轉立方公尺=          0.03
立方公尺轉立方英呎=      35.32
立方碼轉立方公尺 =          0.76
立方公尺轉立方碼=           1.31
立方英吋轉公升=          0.02
公升轉立方英吋=          61.03
加侖轉公升 =              4.55
公升轉加侖 =              0.22
美加侖轉公升=               3.79
公升轉美加侖 =              0.26
盎司轉立方毫升=          30.77
立方毫升轉盎司 =          0.03

#  重量     
 
盎司轉公克=              28.35
公克轉盎司 =              0.04
磅轉公斤 =                   0.45
公斤轉磅 =                   2.21
英噸轉公噸=               1.02
公噸轉英噸 =              0.98
美噸轉公噸=               0.91
公噸轉美噸 =              1.10

透過ResourceMap對資源做管理,真的是便利許多:)

 

迴響:

發表迴響:
迴響功能已被關閉