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對資源做管理,真的是便利許多:)