プロパティ ファイルと ResourceBundle クラスを使用して文字列をフェッチできますResourceBundle.getString()
。また、以下を使用して int および float オブジェクトをフェッチすることもできます。
int a = (int) ResourceBundle.getObject("IntKey");
float b = (float) ResourceBundle.getObject("FloatKey");
しかし、フォントのような複雑なオブジェクトを取得する方法を知りたいですか?
Font font = (Font) ResourceBundle.getObject("FontKey");
しかし、フォントの値をプロパティ ファイルに保存する方法は? 次のようなオブジェクトをnew Font("Tahoma", Font.PLAIN, 12);
プロパティ ファイルの key:value に保存できますか。
更新 1:
@doublesharpあなたの答えは結構です。実際、私は ResourceBundle クラスを拡張して handleGetObjects() メソッドをオーバーライドしていません。私の実装は次のとおりです。
public class Usability {
private static final String BUNDLE_NAME = "com.upgrade.utility.resources.Usability";
private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
private Usability() {}
public static String get(String key, Object ... args) {
String value = null;
try {
value = RESOURCE_BUNDLE.getString(key);
for (Object var : args) {
if (var != null) {
try {
value = value.replaceFirst("@", var.toString());
} catch (Exception e) {}
}
}
} catch (MissingResourceException e) {
value = '!' + key + '!';
}
return value;
}
public static Font getFont(String key){
Font value = null;
try {
String fontName = (String) RESOURCE_BUNDLE.getString(key+ ".Name");
Integer fontStyle = Integer.parseInt(RESOURCE_BUNDLE.getString(key+ ".Style"));
Integer fontSize = Integer.parseInt(RESOURCE_BUNDLE.getString(key+ ".Size"));
value = new Font(fontName, fontStyle, fontSize);
} catch (MissingResourceException e) {
value = new Font("Tahoma", Font.PLAIN, 11);
}catch (NullPointerException npe) {
value = new Font("Tahoma", Font.PLAIN, 11);
}
System.out.println("Font"+ value);
return value;
}
}
この場合、どのようにあなたの方法を使用できますか? JAVA は初めてです。メソッド handleGetObjects() を使用するように実装を変更する方法を教えてください。
更新 2:
@doublesharp: あなたの最後のコメントから、私はこのように修正しましたが、Usability クラスの 3 行目で Class Cast 例外を取得しています。
public class Usability {
private static final String BUNDLE_NAME = "com.upgrade.utility.resources.Usability";
public static final MyResourceBundle RESOURCE_BUNDLE = (MyResourceBundle) MyResourceBundle.getBundle(BUNDLE_NAME);
private Usability() {}
public static String get(String key, Object ... args) {
String value = null;
try {
value = RESOURCE_BUNDLE.getString(key);
for (Object var : args) {
if (var != null) {
try {
value = value.replaceFirst("@", var.toString());
} catch (Exception e) {}
}
}
} catch (MissingResourceException e) {
value = '!' + key + '!';
}
return value;
}
}
私の拡張 ResourceBunlde クラスは次のとおりです。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.util.Enumeration;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
public class MyResourceBundle extends ResourceBundle{
@Override
public Object handleGetObject(String key) {
if (key.contains("Font")) {
return getFont(key);
} else if (key.contains("color")){
return getColor(key);
}else if (key.contains("Dimension")){
return getDimension(key);
}
return this.getObject(key);
}
public Font getFont(String key){
Font value = null;
try {
String fontName = (String) this.getString(key+ ".Name");
Integer fontStyle = Integer.parseInt(this.getString(key+ ".Style"));
Integer fontSize = Integer.parseInt(this.getString(key+ ".Size"));
value = new Font(fontName, fontStyle, fontSize);
} catch (MissingResourceException e) {
value = new Font("Tahoma", Font.PLAIN, 11);
}catch (NullPointerException npe) {
value = new Font("Tahoma", Font.PLAIN, 11);
}
return value;
}
public Color getColor(String key){
Color value = null;
try {
Integer R = Integer.parseInt(this.getString(key+ ".R"));
Integer G = Integer.parseInt(this.getString(key+ ".G"));
Integer B = Integer.parseInt(this.getString(key+ ".B"));
value = new Color(R, G, B);
} catch (MissingResourceException e) {
// value = new Color("Tahoma", Font.PLAIN, 11);
}catch (NullPointerException npe) {
// value = new Color("Tahoma", Font.PLAIN, 11);
}
return value;
}
public Dimension getDimension(String key){
Dimension value = null;
try {
Integer X = Integer.parseInt(this.getString(key+ ".X"));
Integer Y = Integer.parseInt(this.getString(key+ ".Y"));
value = new Dimension(X, Y);
} catch (MissingResourceException e) {
// value = new Color("Tahoma", Font.PLAIN, 11);
}catch (NullPointerException npe) {
// value = new Color("Tahoma", Font.PLAIN, 11);
}
return value;
}
@Override
public Enumeration<String> getKeys() {
return null;
}
}
この例外を解決するにはどうすればよいですか?
また、私の答えに問題はありますか? 私がちょうど呼んでいたものを使用して
Usability.getFont("JPanelUpgradeTypeScreen.ElementLabelFont");
しかし、あなたの回答テクニックを使用して、次のように呼び出す必要があります(呼び出しには型変換が必要です):
(Font)Usability.RESOURCE_BUNDLE.handleGetObject("JPanelUpgradeTypeScreen.ElementLabelFont");